2014-12-30 21 views
5

Mi chiedo perché MVVM manca il comando mancante con l'esecuzione asincrona? Credo che ci siano molti casi in cui ciò potrebbe essere utile, quindi fammi un nome.Esecuzione comando asincrono in luce MVVM

Diciamo che la nostra UI contiene un contenitore che contiene più schermi. L'utente può chiudere un particolare schermo o un contenitore con più schermi. Diciamo che un utente ha emesso un comando di chiusura sul contenitore. Il contenitore in risposta richiama il comando di chiusura su ogni schermata e deve attendere la chiusura dello schermo. Questo in pratica può significare validare i dati. salvataggio, ecc. Per questo motivo è necessario emettere una chiamata asincrona per impedire all'interfaccia utente di non rispondere e inoltre è necessario attendere il completamento dell'attività, per poter continuare.

Quindi, se abbiamo qualcosa di simile in Command

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

} 

Potremmo anche esporre ulteriore metodo sullo schermo, ma a mio parere dovrebbe essere compito della RelayCommand, dal momento che esistono già lì.

Oppure esiste una diversa metodologia per gestire tale scenario?

risposta

2

Probabilmente perché ci sono molti modi diversi per farlo; Descrivo alcuni approcci in my MSDN article on the subject.

I comandi di durata asincrona sono particolarmente complessi. Qualcosa come un comando "vicino" deve essere attentamente considerato. C'è qualche indicazione che è in corso una chiusura? Cosa succede se l'utente si chiude più di una volta (in particolare, "close" può essere avviato da un SO o da un'altra app anche se un "pulsante di chiusura" è disabilitato)?

+0

Questo utilizza MVVM Light? – dumbledad

+0

@dumbledad: No, è indipendente dal framework. –

+0

Non riesco a vedere come applicarlo a MVVM Light, [in particolare] (http://stackoverflow.com/q/30729999/575530) come caricare i dati dal file (ovvero un lavoro inevitabilmente asincrono) all'interno del costruttore del modello di visualizzazione in modo che le pagine siano combinabili. Continuerò a pensare. – dumbledad