2009-02-03 24 views
8

Planteamiento del problema¿Cómo mantengo la coherencia entre el modelo y el modelo de vista en el patrón MVVM?

Estoy escribiendo una aplicación muy básica WPF para alterar el contenido de un archivo de configuración. El formato de datos es un archivo XML con un esquema. Quiero utilizarlo como un proyecto de aprendizaje para MVVM, de modo debidamente He dividido el código en

  • Modelo: las clases C# auto-generado a partir de xsd.exe

  • Vista-Modelo : Representación amigable para la vista del modelo.

  • Ver: Xaml y código vacío detrás

entiendo cómo el Modelo-Vista pueden hacer Ver vinculante una brisa. Sin embargo, ¿eso no deja la View-Model < -> Semántica del modelo 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 tengo que mantener dos tipos de colección completamente diferentes que representan los mismos datos en la coherencia?

¿Cuáles son las mejores prácticas para mantener la coherencia entre el modelo y el modelo de visualización?

Respuesta

6

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 entendimiento de MVVM es que ViewModel debe contener una referencia al modelo para que cuando el usuario modifique la vista, ViewModel debe llamar 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).

2

@¿Esto realmente significa que tengo que mantener dos tipos de colecciones 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/

2

Es necesario ObservableCollections claramente en el modelo de vista así que, sí, se necesitan dos tipos de colección completamente diferentes en el modelo y en el modelo de vista.

He hecho un artículo sobre cómo deshacer/rehacer en MVVM donde puede encontrar una posible solución a esto. Utiliza lo que yo llamo MirrorCollection: una clase derivable de ObservableCollection obtiene automáticamente sus elementos de una lista (la lista del modelo).

Creo que es una solución interesante, se pueden encontrar los artículos aquí

Part 1: Using the Viewmodel pattern to provide Undo/Redo in WPF

Part 2: Viewmodelling lists (aquí es la definición MirrorCollection)

0

Expose Events o delegados de modelo y de enganchar a la misma en ViewModel, cuando los valores en el modelo cambien notifiquen a viewmodel a través de un evento o delegados y desde Viewmodle puede actualizar la UI.

Si desea actualizarlo de ver modelo a modelo tan simple como que simplemente llame a algún método pase los nuevos valores

Cuestiones relacionadas