2010-02-17 37 views
9

Estaba buscando en MVVM nuevamente después de un tiempo en el que realmente no seguí los nuevos desarrollos y noté que la cantidad de tutoriales/guías, etc. ha crecido mucho. Sin embargo, la mayoría de ejemplos/ejemplos de implementaciones de MVVM carecen para explicar algo que no es muy claro para mí. Todos estos ejemplos son bastante simples y ninguno de ellos lee algo de una base de datos/archivo/etc.Aclaración MVVM: ¿Qué pertenece a ViewModel, qué pertenece al modelo?

Ahora, por ejemplo, tengo alguna aplicación tipo pintura y guardo las pinturas en XAML. ¿Qué pertenece al ViewModel que pertenece al Modelo?

¿El modelo suministra funciones para cargar/guardar las pinturas de/a un archivo XAML?

¿El ViewModel se vincula a las propiedades que expone el Modelo (Color, Ancho, Posición, etc.)?

¿La validación ocurre en el modelo o en el modelo de vista?

Respuesta

2

El ViewModel es la representación del modelo adecuado para la tecnología de presentación que está utilizando.

En su ejemplo, creo que el Modelo no proporcionaría las funciones para cargar/guardar las pinturas desde/hacia un archivo XAML. Esto se llevaría a cabo en un Objeto/Repositorio de acceso a datos que sería utilizado por ViewModel tomando como ejemplos las instancias del Modelo. Sin embargo, este bit a menudo es variable y depende de cómo se vean las clases de su modelo.

El ViewModel en sí no suele utilizar el enlace de datos. Simplemente expone el Modelo a la Vista de una manera que es útil para la tecnología de presentación (Vista). En el caso de WPF/Silverlight, básicamente significa que implementa la interfaz INotifyPropertyChanged.

La validación generalmente se inicia con la vista (como casi todo), se realiza en el modelo de vista pero a menudo se delega por el modelo de vista al modelo. Por supuesto, es mejor no repetir sus validaciones en toda su aplicación. El mejor lugar para las validaciones comunes es el Modelo (consulte IDataErrorInfo). Sin embargo, las validaciones que son específicas de su ViewModel pueden manejarse directamente en ViewModel.

+0

Creo que se justifica la discusión sobre la exposición de los cambios de datos que suceden en el Modelo a ViewModel para que puedan vincularse y actualizarse a la Vista mediante el enlace de datos normal. Si piensa en una capa de datos, tendría métricas sobre el estado de los datos extraídos en el proceso de mantener esa información (piense en un almacén de datos fuera de línea, específicamente). Si esas métricas existen y cambian en la capa Modelo, ¿cómo impulsaría la notificación de cambio del Modelo a ViewModel para la vinculación de datos a la Vista? – ScottCher

0

Desde un lado, ViewModel podría ser un contenedor para el objeto Model y lo puede ampliar con los detalles de la presentación. Por ejemplo, si tiene un objeto Model - Pen, entonces PenViewModel puede contener IsSelected, IsDragging properties etc. This es ViewModel como envoltorio.

Desde el otro lado, ViewModel podría ser una abstracción sobre la Vista que no contiene referencia a controles particulares. No olvide que el de fin de MVVM es unit testing. Entonces, por ejemplo, tienes barras arrastrables en tu aplicación de pintura. Para que pueda abstraer esta característica con el conjunto de ViewModels: BarViewModel {IsSnapped, Position, IsEnabled}, BrushBarViewModel: BarViewModel, PenBarViewModel, etc. Y luego puede cubrir esta función con pruebas unitarias, pero todo esto no tiene relación con el Modelo. Esto es ViewModel as View abstraction.

El modelo está muy cerca del negocio, contiene entidades de negocios y lógica, clases para persistir entidades, servicios. Puede usar diferentes conceptos en su Modelo, p. DDD (Domain-Driven-Design), Fawler's Enterprise Patterns, CQRS (Command Query Responsibility Segregation), SOA (Service Oriented Architecture).

Ver sincroniza el estado con ViewModel (Modelo) utilizando vinculando el mecanismo, el peor caso en el código detrás como en el patrón PresentationModel.

Bases sobre esto, responder a sus preguntas va a ser:

¿Tiene las funciones de suministro Modelo para cargar/guardar las pinturas de/a un archivo XAML?

Nº Modelo no tiene referencia directa a los archivos XAML.

¿El modelo de vista se unen a las propiedades que expone el modelo (color, ancho, posición, etc.)?

No. Encuadernación es el mecanismo de Ver sincronización. Por lo tanto, debe vincular View a esas propiedades. Puede vincular la Vista directamente al Modelo o al contenedor ViewModel.

sí ocurre la validación en el modelo o en el modelo de vista?

Wherenever. Si su validación de soporte de control puede validar en la capa de visualización, p. DateTimePicker no permite seleccionar una fecha incorrecta. Puede escribir una lógica de validación personalizada en ViewModel y cubrirla con pruebas unitarias. Además, la validación puede realizarse en el nivel del Modelo, como verificación adicional, porque el Modelo no puede estar en estado inválido.

Cuestiones relacionadas