2011-02-03 20 views
19

tengo una visión que tiene 2 sub vistas en él y un modelo de vista se asigna a cada punto de vista:WPF MVVM: ¿Cómo se comunican ViewModels entre sí?

ViewA - ViewModelA 
{ 
    ViewB - ViewModelB 
    ViewC - ViewModelC 
} 

ViewB tiene un cuadro de texto y viewC tiene un cuadro combinado, ambos de los cuales necesito acceso desde ViewModelA. No es el control de la GUI en sí, sino el valor vinculado, es decir, .Texto del cuadro de texto y .SelectedItem del ComboBox. Actualmente solo tengo ViewModelB y ViewModelC como propiedades en ViewModelA, pero se siente mal.

¿Cuál es la forma estándar para que los modelos de visualización se comuniquen entre sí sin romper el patrón de MVVM? Soy completamente nuevo en WPF/MVVM.

+2

* ViewModelB tiene un cuadro de texto y ViewModelC tiene un cuadro combinado * ... Si voy a tomar esto literalmente, ya estás rompiendo el patrón MVVM. Los modelos de vista no hacen referencia a los controles de WPF, sino que exponen las propiedades * vinculadas * a las propiedades de dependencia de los controles * en las vistas *. Las máquinas virtuales pueden exponer propiedades en beneficio de Vistas vinculadas a ellas, pero deben permanecer ignorantes de la naturaleza (o existencia) de esas Vistas. –

+1

whoops quise decir que ViewB tiene un cuadro de texto y ViewC tiene un cuadro combinado, lo arreglaré. – Dev1

Respuesta

11

Una forma de haberse desconectado ViewModels comunicarse entre sí es utilizar un mecanismo de publicación/suscripción tal como PRISM s EventAggregator. Sin embargo, en una relación padre/hijo de ViewModel, creo que está bien que los padres tengan conocimiento directo y control sobre el ViewModel hijo.

Personalmente, no creo que componer un ViewModel de otros ViewModels sea una mala práctica. Lo hago todo el tiempo. I generally favor composition over inheritance en mi ViewModels.

+0

* Generalmente prefiero la composición sobre la herencia en mis modelos de vista *: son dos cosas diferentes y una VM puede usar ambas. – slugster

+0

@slugster - Sí, uso ambos. Ejemplo: A menudo planteo muchas de las inquietudes de infraestructura en un modelo de vista base (INotifyPropertyChanged, etc ...). –

+0

@slug Diría herencia por funcionalidad y composición para información. – LuckyLikey

3

Los ViewModels generalmente "heredan" relaciones del Modelo. Y no está mal agregar una relación cuando tiene sentido.

Está perfectamente bien que un ViewModel tenga una propiedad que se refiera a otro ViewModel.

Cuestiones relacionadas