modal ejemplo dialogbox wpf design-patterns mvvm mvp

wpf - dialogbox - showdialog c# ejemplo



Model-View-Presenter y cuadros de diálogo Modal... ¿Cómo? (4)

Necesitarás un controlador en tu caso. El controlador debe estar a cargo de mostrar la ventana de diálogo de preferencias.

Como puedo imaginarlo, el controlador debería ser responsable de crear ShellModelView y DataContext de la vista vinculante. El controlador también debe ser responsable de manejar la ejecución de comandos de EditPreferences. En la lógica de ejecución, el controlador creará un nuevo PreferencesDialog y su correspondiente modelo de vista.

Puedes encontrar patrones similares en Prism si aún no lo has hecho. También puede reutilizar el DelegateCommand provisto allí :)

Estoy implementando MVP / MV-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.

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 colocar 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 emparejar correctamente el diálogo. ShellModelView es el DataContext de ShellView, pero no veo una retro-referencia configurada. 2. ShellModelView no debería cargar una 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 en él, 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?).


Haga que el PreferencesDialog implemente una interfaz que sea una de las propiedades del comando EditPreference. El comando interactuaría con el diálogo a través de la interfaz. Para la prueba unitaria, el objeto simulado implementaría la interfaz en su lugar.

La clase de diálogo entonces puede residir en su capa más alta.


Mis 2 centavos es:

  1. Pase algún tipo de contrato viewfactory como el parámetro de comando o inyecte un contrato de viewfactory en el modelo de vista. El modelo de vista usará viewfactory para crear cualquier vista modal / no modal que necesite. Viewfactory también podría tomar como parámetro de su método Show / ShowModal un modelo de vista para mostrar. Además, viewfactory podría usar un datatemplate para mostrar cualquier viewmodal pasado como parámetro.

  2. Agregue una propiedad ShowViewModel al modelo de vista en cuestión. Un DataTrigger podría mirar esta propiedad y, cuando sea de un tipo particular, mostrar la vista, etc.


Tal vez esta no sea la forma adecuada de verlo, pero este es el enfoque que tomo con MV-VM en WPF. La apertura de ventanas y cuadros de diálogo o una vista "EditPreferences" son funciones específicas de UI. Si tuviera que reescribir la interfaz de usuario completa reemplazando todas las vistas, puedo terminar combinando la vista "EditarPreferencias" con otra vista y, por lo tanto, nunca quiero abrirla en otra pantalla. Si esto estuviera relacionado con ViewModel, sería difícil moverse. En esta situación particular, tendría un botón o elemento de menú en mi "ShellView" que crea una nueva instancia de mi vista "EditPreferences", y luego pasa en el modelo de vista "EditPreferences" que puede provenir de una propiedad en mi "ShellViewModel" ", o tal vez mi vista" EditPreferences "ejemplifica el propio ViewModel.

Aquí hay una pregunta similar sobre SO que básicamente dice lo mismo: MV-VM Design Question. Llamando Vista desde ViewModel