Esempio n. 1: ho una vista visualizzata nella mia applicazione MVVM (usiamo Silverlight ai fini della discussione) e faccio clic su un pulsante che dovrebbe portarmi in una nuova pagina.
Esempio n. 2: quella stessa vista ha un altro pulsante che, quando si fa clic, dovrebbe aprire una vista dei dettagli in una finestra figlio (finestra di dialogo).
Sappiamo che ci saranno oggetti Command esposti dal nostro ViewModel associati ai pulsanti con metodi che rispondono al clic dell'utente. Ma allora? Come completiamo l'azione? Anche se utilizziamo un cosiddetto NavigationService, cosa stiamo dicendo?
Per essere più specifici, in un modello tradizionale Visualizza per primo (come gli schemi di navigazione basati su URL come sul web o il framework di navigazione integrato di SL) gli oggetti Comando dovrebbero sapere quale Vista visualizzare successivamente. Ciò sembra oltrepassare il limite quando si tratta della separazione delle preoccupazioni promossa 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 viste controllino il flusso delle applicazioni e la navigazione non sia solo un altro tipo di logica aziendale? (Posso dire di sì in alcuni casi e no in altri.)
Per me, l'implementazione utopica del modello MVVM (e ho sentito che altri lo professano) sarebbe quella di avere ViewModel cablato in modo tale che l'applicazione possa funzionare senza testa (cioè senza viste). Ciò fornisce la maggior parte della superficie per i test basati su codice e rende le viste una vera skin per l'applicazione. E il mio ViewModel non dovrebbe importare se visualizzato nella finestra principale, in un pannello mobile o in una finestra figlio, dovrebbe?
Secondo questo approccio, spetta ad altri meccanismi in fase di esecuzione "associare" ciò che View dovrebbe essere visualizzato per ciascun ViewModel. E se volessimo condividere una vista con più ViewModel 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 viste, inclusa la visualizzazione di finestre / finestre di dialogo figlio, come possiamo realizzarlo nel modello MVVM?