Ejemplo # 1: Tengo una vista mostrada en mi aplicación MVVM (usemos Silverlight para los propósitos de la discusión) y hago clic en un botón que debería llevarme a una nueva página.
Ejemplo # 2: Esa misma vista tiene otro botón que, al hacer clic, debería abrir una vista de detalles en una ventana secundaria (diálogo).
Sabemos que habrá objetos de comando expuestos por nuestro ViewModel vinculados a los botones con métodos que responden al clic del usuario. Pero entonces, ¿qué? ¿Cómo completamos la acción? Incluso si usamos el llamado NavigationService, ¿qué le estamos diciendo?
Para ser más específicos, en un modelo tradicional de Ver primero (como los esquemas de navegación basados en URL, como en la web o el marco de navegación incorporado SL), los objetos de Comando tendrían que saber qué Vista mostrar a continuación. Eso parece cruzar la línea cuando se trata de la separación de preocupaciones promovidas por el patrón.
Por otro lado, si el botón no estaba conectado a un objeto Command y se comportaba como un hipervínculo, las reglas de navegación podrían definirse en el marcado. ¿Pero queremos que las Vistas controlen el flujo de la aplicación y que la navegación no sea solo otro tipo de lógica empresarial? (Puedo decir que sí en algunos casos y no en otros).
Para mí, la implementación utópica del patrón MVVM (y he oído que otros profesan esto) sería tener el ViewModel conectado de tal manera que la aplicación pueda ejecutarse sin cabeza (es decir, sin Vistas). Esto proporciona la mayor área de superficie para pruebas basadas en código y hace que las Vistas sean una verdadera máscara en la aplicación. Y mi ViewModel no debería importarme si se muestra en la ventana principal, un panel flotante o una ventana secundaria, ¿verdad?
De acuerdo con esta evaluación, depende de algún otro mecanismo en tiempo de ejecución 'vincular' qué Vista se debe mostrar para cada ViewModel. Pero, ¿qué sucede si queremos compartir una Vista con múltiples ViewModels o viceversa?
Entonces, dada la necesidad de administrar la relación View-ViewModel para saber qué mostrar cuando junto con la necesidad de navegar entre las vistas, incluida la visualización de ventanas / cuadros de diálogo secundarios, ¿cómo logramos realmente esto en el patrón MVVM?