Esempio 1: ho una vista visualizzata nella mia applicazione MVVM (usiamo Silverlight ai fini della discussione) e clicco su un pulsante che dovrebbe portarmi a una nuova pagina.
Esempio n. 2: quella stessa vista ha un altro pulsante che, se cliccato, dovrebbe aprire una vista dettagli in una finestra figlia (finestra di dialogo).
Sappiamo che ci saranno oggetti Command esposti dal nostro ViewModel legati ai pulsanti con metodi che rispondono al clic dell'utente. Ma che cosa allora? Come completiamo l'azione? Anche se usiamo un cosiddetto NavigationService, cosa stiamo dicendo?
Per essere più specifici, in un modello View-first tradizionale (come gli schemi di navigazione basati su URL come sul web o il framework di navigazione integrato SL) gli oggetti Command dovrebbero sapere quale Vista visualizzare in seguito. Ciò sembra superare la linea quando si tratta della separazione delle preoccupazioni promosse dal modello.
D'altra parte, se il pulsante non era collegato a un oggetto Command e si comportava come un collegamento ipertestuale, le regole di navigazione potevano essere definite nel markup. Ma vogliamo che le Views controllino il flusso delle applicazioni e non sia la navigazione solo un altro tipo di business logic? (Posso dire di sì in alcuni casi e no in altri.)
Per me, l'implementazione utopica del pattern MVVM (e ho sentito altri che professano questo) sarebbe di avere il ViewModel cablato in modo tale che l'applicazione possa girare senza headless (cioè senza Views). Ciò fornisce la maggior parte della superficie per i test basati su codice e rende le viste un vero skin sull'applicazione. E il mio ViewModel non dovrebbe preoccuparsi se viene visualizzato nella finestra principale, in un pannello mobile o in una finestra secondaria, dovrebbe?
In base a questo approccio, a runtime è necessario un altro meccanismo per "legare" quale vista dovrebbe essere visualizzata per ciascun ViewModel. Ma cosa succede se vogliamo condividere una vista con più ViewModels o viceversa?
Quindi, data la necessità di gestire la relazione View-ViewModel in modo da sapere cosa visualizzare quando insieme alla necessità di navigare tra le visualizzazioni, inclusa la visualizzazione di finestre figlio / finestre di dialogo, come possiamo davvero realizzarlo nel pattern MVVM?