Me gusta pensarlo de esta manera:
Las vistas, como dices, son tontas. Josh Smith, escritor del artículo fundamental y frecuentemente vinculado de MSDN sobre MVVM, ha dicho que las vistas son "la ropa que usan los datos". Las vistas nunca contienen datos ni los manipulan directamente, solo están vinculados a propiedades y comandos de sus modelos de vista.
Los modelos son objetos que modelan el dominio de su aplicación , como en los objetos comerciales. ¿Tu aplicación es una tienda de música? Quizás sus objetos modelo sean artistas, álbumes y canciones. ¿Es su aplicación un navegador de organigramas? Quizás los objetos de su modelo sean gerentes y empleados. Estos objetos de modelo no están relacionados con ningún tipo de representación visual, y ni siquiera están directamente relacionados con la aplicación en la que los está colocando; sus objetos de modelo deben tener sentido por sí mismos como una familia de objetos que representan algún tipo de dominio. La capa de modelo también suele incluir cosas como accesos de servicio.
Esto nos lleva a Viewmodels. ¿Qué son? Son objetos que modelan una aplicación GUI, lo que significa que proporcionan datos y funciones para que las utilicen las vistas. Son los que definen la estructura y el comportamiento de la aplicación real que está creando. Para los objetos del modelo, el dominio es cualquier dominio que elija (tienda de música, navegador de organigramas, etc.), pero para el modelo de vista, el dominio es una aplicación gráfica. Sus modelos de vista encapsularán el comportamiento y los datos de todo lo que hace su aplicación. Van a exponer objetos y listas como propiedades, así como cosas como Comandos. Un comando es solo un comportamiento (en su forma más simple, una llamada a un método) envuelto en un objeto que lo transporta; esta idea es importante porque las vistas son impulsadas por el enlace de datos, que adjunta controles visuales a los objetos. En MVVM, no le das a un botón un método de controlador de clic,
Para mí, los bits más confusos fueron los siguientes:
- Aunque los modelos de vista son modelos de una aplicación gráfica, no hacen referencia directa ni utilizan conceptos visuales. Por ejemplo, no desea referencias a los controles de Windows en sus ViewModels; esas cosas van en la vista. ViewModels simplemente expone datos y comportamientos a controles u otros objetos que se unirán a ellos. Por ejemplo, ¿tiene una vista con un ListBox en ella? Es casi seguro que su modelo de vista tendrá algún tipo de colección. ¿Tu vista tiene botones? Es casi seguro que su modelo de vista tendrá algunos comandos.
- Hay algunos tipos de objetos que podrían considerarse "modelos de vista". El tipo de modelo de vista más simple de entender es el que representa directamente un control o una pantalla en una relación 1: 1, como en "la pantalla XYZ tiene un cuadro de texto, un cuadro de lista y tres botones, por lo que el modelo de vista necesita una cadena, una colección, y tres mandamientos ". Otro tipo de objeto que encaja en la capa de modelo de vista es un envoltorio alrededor de un objeto de modelo que le da comportamiento y lo hace más utilizable por una vista; aquí es donde entra en los conceptos de capas de modelo de vista "gruesas" y "finas". Una capa de modelo de vista "delgada" es un conjunto de modelos de vista que exponen los objetos de su modelo directamente a las vistas, lo que significa que las vistas terminan vinculando directamente a las propiedades de los objetos del modelo. Esto puede funcionar para cosas como vistas simples de solo lectura, pero ¿y si desea tener un comportamiento asociado con cada objeto? No quiere eso en el modelo, porque el modelo no está relacionado con la aplicación, solo está relacionado con su dominio. Puede ponerlo en un objeto que envuelva su objeto modelo y ofrezca datos y comportamientos más fáciles de vincular. Este objeto contenedor también se considera un modelo de vista, y tenerlos da como resultado una capa de modelo de vista "más gruesa", donde sus vistas nunca terminan vinculando directamente a nada en una clase de modelo. Las colecciones contendrán modelos de vista que envuelvan modelos en lugar de contener modelos en sí mismos. Puede ponerlo en un objeto que envuelva su objeto modelo y ofrezca datos y comportamientos más fáciles de vincular. Este objeto contenedor también se considera un modelo de vista, y tenerlos da como resultado una capa de modelo de vista "más gruesa", donde sus vistas nunca terminan vinculando directamente a nada en una clase de modelo. Las colecciones contendrán modelos de vista que envuelvan modelos en lugar de contener modelos en sí mismos. Puede ponerlo en un objeto que envuelva su objeto modelo y ofrezca datos y comportamientos más fáciles de vincular. Este objeto contenedor también se considera un modelo de vista, y tenerlos da como resultado una capa de modelo de vista "más gruesa", donde sus vistas nunca terminan vinculando directamente a nada en una clase de modelo. Las colecciones contendrán modelos de vista que envuelvan modelos en lugar de contener modelos en sí mismos.
El agujero del conejo es más profundo: hay muchos modismos para descubrir, como ValueConverters, que mantienen MVVM en funcionamiento, y hay mucho que aplicar cuando comienza a pensar en cosas como Blendability, pruebas y cómo pasar datos en su aplicación y asegurarse de que cada modelo de vista tiene acceso al comportamiento que necesita (aquí es donde entra la inyección de dependencia), pero es de esperar que lo anterior sea un buen comienzo. La clave es pensar en sus imágenes, su dominio y la estructura y el comportamiento de su aplicación real como tres cosas diferentes.