Estoy implementando MVP/M-V-VM en WPF y estoy teniendo buena suerte hasta el momento. Sin embargo, no veo cómo este modelo admite la implementación de cuadros de diálogo Modal. He derivado mi trabajo de Crack.NET (http://www.codeplex.com/cracknetproject) para aprender cómo funciona esto.Modelo-Vista-Presentador y cuadros de diálogo Modal .... ¿Cómo?
Tengo una vista ShellView (que es solo XAML) que tiene un menú en ella. El menú se une a un comando en ShellModelView que dice "EditPreferences".
ShellModelView implementa el ICommand para EditPreferences y aquí queremos poner un cuadro de diálogo para permitir al usuario editar las preferencias de la aplicación.
Varios problemas aquí: 1. ShellModelView no tiene una referencia al ShellView para originar correctamente el diálogo. ShellModelView es el DataContext de ShellView, pero no veo una retro-referencia configurada. 2. ShellModelView no debería cargar interfaz de usuario explícita de todos modos. Entonces, ¿cuál es el modelo de interacción adecuado aquí? 3. ¿Cómo construyo mi PreferencesDialog para que esté adecuadamente separado entre la lógica y la vista también? PreferencesDialog en sí necesita ser una ventana para que pueda llamar a ShowDialog, pero eso significa que necesita una referencia a la ventana (por ejemplo, ver) para crear una instancia. Idealmente, debería ser capaz de probar el código/validación unitaria dentro de PreferencesDialog sin crear una instancia de la vista (¿usando una vista simulada quizás?).
pensé que uno de los objetivos de MVVM es lograr no tener el modelo de vista sabe nada de la Vista (o diálogo en tu ejemplo)? De modo que cualquier cantidad de Vistas (o ninguna) puede estar usando un Modelo de Vista en cualquier momento. Tener su ViewModel configurado cosas en una interfaz de View un poco rompe eso. –
No porque la interfaz aísla el comando de la implementación del diálogo. –
Ese es el patrón de MVP. Al cambiar su interfaz de Vista sugerida se rompería el ViewModel, p. cambie la firma de un método o tipo de propiedad, BAM acaba de romper su ViewModel que tiene una dependencia en la interfaz. En MVVM, la vista 'observa' el ViewModel mediante enlaces. Hacer cambios en la Vista (por ejemplo, agregar controles) no requerirá cambiar las interfaces o incluso volver a compilar ViewModel. Lo bueno es que un solo ViewModel puede ser 'observado' por muchas Vistas. Vea el patrón Observer en el libro GOF y lea la sección de documentación de Prism 'Modelo de presentación' si le interesa más esto :) –