2014-12-30 7 views
5

Zastanawiam się, dlaczego brakuje polecenia MVVM z brakiem wykonania asynchronicznego? Wierzę, że jest wiele przypadków, w których może to być przydatne, więc pozwól mi wymienić jeden.Wykonanie polecenia Async w świetle MVVM

Powiedzmy, że nasz interfejs użytkownika zawiera jeden kontener zawierający wiele ekranów. Użytkownik może zamknąć określony ekran lub kontener z wieloma ekranami. Powiedzmy, że użytkownik wydał polecenie zamknięcia kontenera. Kontener w odpowiedzi wywołuje polecenie zamknięcia na każdym ekranie i musi czekać na zamknięcie ekranu. W praktyce może to oznaczać walidację danych. oszczędzanie itp. Z tego powodu musimy wywołać wywołanie asynchroniczne, aby interfejs użytkownika przestał odpowiadać, a także musimy czekać na zakończenie zadania, aby kontynuować.

Tak więc, jeśli mamy coś takiego w Dowództwie

public RelayCommand CloseCommand 
{ 
    get { return _closeCommand ?? _closeCommand = new RelayCommand(async() => 
    { 
     foreach (var screen in Screens) 
     { 
      if (!await screen.CloseCommand.ExecuteAsync(null)) 
      { 
       // do something 
      } 
     } 
    }) } 

} 

Mogliśmy również wystawiać dodatkową metodę na ekranie, ale moim zdaniem powinno być zadaniem RelayCommand, ponieważ istnieje tam.

Czy istnieje inna metodologia obsługi takiego scenariusza?

Odpowiedz

2

Prawdopodobnie dlatego, że istnieje wiele różnych sposobów robienia tego; Opisuję kilka podejść w my MSDN article on the subject.

Asynchroniczne polecenia życia są szczególnie trudne. Coś w rodzaju polecenia "bliskiego" należy dokładnie rozważyć. Czy istnieją pewne wskazówki, że proces zamykania jest w toku? Co się stanie, jeśli użytkownik zamknie się więcej niż jeden raz (w szczególności "zamknij" może często zostać zainicjowany przez system operacyjny lub inną aplikację, nawet jeśli "przycisk zamykania" jest wyłączony)?

+0

Czy to wykorzystuje światło MVVM? – dumbledad

+0

@dumbledad: Nie, jest to metoda niezależna od ramek. –

+0

Nie widzę, w jaki sposób zastosować go do MVVM Light, [w szczególności] (http://stackoverflow.com/q/30729999/575530), jak załadować dane z pliku (tj. Nieuchronnie asynchrous pracy) w konstruktorze modelu widoku aby strony były Blendable. Będę dalej myśleć. – dumbledad

Powiązane problemy