He estado experimentando con el patrón de MVVM mencionado anteriormente y he estado teniendo dificultades para definir límites claros en algunos casos. En mi aplicación, tengo un diálogo que me permite crear una conexión a un controlador. Hay una clase ViewModel para el diálogo, que es bastante simple. Sin embargo, el cuadro de diálogo también alberga un control adicional (elegido por ContentTemplateSelector
), que varía según el tipo particular de Controlador que se está conectando. Este control tiene su propio ViewModel.MVVM: ¿Cómo manejar la interacción entre ViewModels anidados?
El problema que me surge es que, cuando cierro el cuadro de diálogo presionando OK, necesito crear realmente la conexión solicitada, que requiere información capturada en la clase interna ViewModel específica del controlador. Es tentador simplemente tener todas las clases de ViewModel específicas del controlador implementando una interfaz común que construye la conexión, pero ¿el ViewModel interno realmente debería estar a cargo de esta construcción?
Mi pregunta general es: ¿hay patrones de diseño generalmente aceptados sobre cómo los Modelos de Vista deberían interactuar entre ellos, particularmente cuando una VM "padre" necesita ayuda de una VM "infantil" para saber qué hacer?
EDIT:
Yo he venido para arriba con un diseño que es un poco más limpio que estaba pensando en un principio, pero todavía no estoy seguro de si es la manera 'correcta' de hacerlo. Tengo algunos servicios de back-end que permiten que ContentTemplateSelector mire una instancia de Controller y pseudo-mágicamente encuentre un control para mostrar para el constructor de conexiones. Lo que me molestaba acerca de esto es que mi ViewModel de nivel superior tendría que mirar el DataContext
para el control generado y convertirlo a una interfaz adecuada, lo que parece una mala idea (¿por qué la View DataContext
tiene algo que ver con la creación ? la conexión)
terminé con algo como esto (simplificar):
public interface IController
{
IControllerConnectionBuilder CreateConnectionBuilder();
}
public interface IControllerConnectionBuilder
{
ControllerConnection BuildConnection();
}
tengo mi clase de modelo de vista interno implementar IControllerConnectionBuilder
y el controlador devuelve el modelo de vista interno. El ViewModel de nivel superior luego visualiza este IControllerConnectionBuilder
(a través del mecanismo pseudo-mágico). Todavía me molesta un poco que sea mi ViewModel interno la realización del edificio, pero al menos ahora mi ViewModel de nivel superior no tiene que saber acerca de los detalles sucios (ni siquiera sabe o le importa que el control visualizado está utilizando un ViewModel).
Acepto pensamientos adicionales si hay formas de limpiar esto más. Todavía no está claro cuánta responsabilidad está 'bien' para que ViewModel tenga.
Nos hacemos este tipo de preguntas constantemente en mi trabajo. Has formulado esta pregunta muy bien, así que espero que obtengas algunos buenos comentarios aquí. –
Afortunadamente este es un proyecto de mascotas, así que tengo el lujo de explorar diferentes diseños. Mi tienda no ha adoptado WPF o MVVM porque los gastos generales y la incomodidad en esta etapa temprana no son aceptables para nuestros horarios actuales. Creo firmemente que esta es una tecnología que pagará grandes dividendos en productividad una vez que comprendamos cómo usarla, pero es un cambio de perspectiva que es difícil saber dónde trazar las líneas en un diseño. –