wpf - patron - ¿Cómo mantengo la coherencia entre el modelo y el modelo de visualización en el patrón MVVM?
patron mvvm explicado (4)
Planteamiento del problema
Estoy escribiendo una aplicación WPF muy básica para alterar el contenido de un archivo de configuración. El formato de datos es un archivo XML con un esquema. Quiero usarlo como un proyecto de aprendizaje para MVVM, por lo que he dividido debidamente el código en
Modelo : clases de C # autogeneradas desde xsd.exe
View-Model : Representación amigable para la vista del modelo.
Vista : Xaml y código vacío detrás
Entiendo cómo View-Model puede hacer que View-binding sea muy fácil. Sin embargo, ¿eso no deja la semántica del Modelo View-Model <-> muy incómoda? Xsd.exe genera clases C # con matrices para múltiples elementos XML. Sin embargo, en el nivel V-VM necesita colecciones observables.
Preguntas:
¿Significa esto realmente que tengo que mantener dos tipos de colección completamente diferentes que representen los mismos datos en coherencia?
¿Cuáles son las mejores prácticas para mantener la coherencia entre el modelo y el modelo de visualización?
@ ¿Esto realmente significa que tengo que mantener dos tipos de colección completamente diferentes que representen los mismos datos en coherencia?
Creo que sí. Es bastante aburrido, pero funciona bastante bien. Con suerte, en el futuro también tendremos un generador de código para crear la parte de ViewModel.
Karl está trabajando en eso: http://karlshifflett.wordpress.com/mvvm/
No soy un gran experto, pero creo que ese es el caso, sí. La idea general es, de hecho, propagar el cambio entre la vista y viewModel via Binding, y luego entre ViewModel y el modelo a través de eventos (en el modelo -> ViewModel dirección) o dependencia (en la otra dirección).
No sé qué tan estándar es eso, pero mi comprensión de MVVM es que ViewModel debe contener una referencia al modelo para que cuando el usuario modifique la vista, ViewModel llame al código apropiado en el modelo. A la inversa, el Modelo debería generar eventos cuando se modifiquen, y el ViewModel debería actualizarse en consecuencia (el ViewModel es un observador para el modelo).
Necesitas claramente ObservableCollections en el modelo de vista, así que sí, necesitarás dos tipos de colección completamente diferentes en el modelo y en el modelo de vista.
He hecho un artículo sobre deshacer / rehacer en MVVM donde puedes encontrar una posible solución a esto. Utiliza lo que yo llamo el MirrorCollection : una clase derivada de ObservableCollection que automáticamente obtiene sus artículos de una lista (la lista del modelo).
Creo que es una solución interesante, puedes encontrar los artículos aquí
Parte 1: Usar el patrón de Viewmodel para proporcionar Deshacer / Rehacer en WPF
Parte 2: listas Viewmodelling (aquí está la definición MirrorCollection)
Exponga eventos o delegados en el modelo y enganche al mismo en ViewModel, cuando los valores en el modelo cambien notifiquen a viewmodel por evento o delegados y desde Viewmodle puede actualizar la interfaz de usuario.
Si desea actualizarlo desde el modelo de vista al modelo, tan simple como eso, simplemente llame a algún método para pasar los nuevos valores