Continúo luchando con el patrón MVVM y, al intentar crear un diseño práctico para un proyecto pequeño/mediano, me he encontrado con una serie de desafíos. Uno de estos desafíos es descubrir cómo obtener los beneficios del desacoplamiento con este patrón sin crear muchos códigos repetitivos y difíciles de mantener.MVVM: modelos de vista finos y modelos enriquecidos
Mi estrategia actual ha sido crear clases de modelos 'ricas'. Son plenamente conscientes de que serán consumidos por un patrón MVVM e implementarán INotifyPropertyChanged, permitirán que se observen sus colecciones y se mantendrán conscientes de que pueden estar siempre bajo observación. Mis clases de ViewModel tienden a ser delgadas, solo exponen propiedades cuando los datos realmente necesitan transformarse, y la mayor parte de su código son los manejadores de RelayCommand. Las vistas se unen alegremente a ViewModels o Models directamente, dependiendo de si se requiere alguna transformación de datos. Utilizo AOP (a través de Postsharp) para aliviar el dolor de INotifyPropertyChanged, por lo que es fácil hacer que todas mis clases de modelos sean 'ricas' de esta manera.
¿Existen desventajas significativas al usar este enfoque? ¿Puedo suponer que ViewModel y View están tan estrechamente acoplados que si necesito una nueva transformación de datos para View, simplemente puedo agregarlos al ViewModel según sea necesario?
'Fuerzas' externas es una buena descripción de cómo funciona actualmente mi diseño. Mi VM está transformando el Modelo (si es necesario) para la Vista, pero la VM, otros Modelos o una VM completamente diferente que interactúa con él de otra manera pueden actuar sobre el Modelo. Si una extensión de herramienta agrega un cable en mi modelo, me gustaría que todas mis VM y vistas miren el cableado para ver el cambio. Creé colecciones personalizadas que monitorean el Model ObservableCollections para proporcionar un filtrado especial (más allá del solo filtro de CollectionView), pero la mayoría de las veces me vinculo al Model ObservableCollection. –