2011-06-08 20 views
7

Estoy tratando de encontrar la manera de hacer lo siguiente:MVVM - La comunicación entre Separados Vistas

Tengo un CustomerListViewModel que contiene una ObservableCollection<Customer>

MainView contiene una instancia de estos puntos de vista:

  • CustomerListView - que crea una instancia de CustomerListViewModel
  • SearchView - que crea una instancia de SearchViewModel

Mi pregunta es, ¿cómo puedo mantener el CustomerListView y el SearchView separados? SearchView solo se debe mostrar si se selecciona un cliente. La única dependencia para SearchViewModel debe ser un modelo Customer. Si no hay un Cliente seleccionado del CustomerListViewModel, entonces SearchView no se debe mostrar.

¿Debo introducir una nueva vista/modelo de vista que contiene un CustomerListViewModel y SearchViewModel que puede contener una referencia a la Customer seleccionada y alternar la visualización de un SearchView? Si no, ¿cómo debería hacerlo?

Sé que esta pregunta es bastante amplia, pero agradecería cualquier sugerencia.

+0

Eso es lo que haría. Un ViewModel que combina dos o más ViewModels. El ViewModel compuesto puede suscribirse a eventos y alternar la visibilidad. – tomasmcguinness

Respuesta

4

No haga que MainView contenga instancias de CustomerListView y SearchView. Los tres deben estar separados.

Por lo que se refiere a la comunicación entre vistas, esto debe hacerse a través del respectivo modelo de vista utilizando, por ejemplo, mvvm-light messenger. Si registra un messenger diferente con cada vista, desde un viewmodel puede enviar un mensaje a la vista que desee.

sólo un ejemplo de la sencillez de uso de un mensajero MVVMLight: -

Vista:

Messenger.Default.Register<NotificationMessage>(this, OpenViewMessageReceived); 

private void OpenViewMessageReceived(NotificationMessage msg) 
{ 
    //Logic 
} 

modelo de vista:

Messenger.Default.Send(new NotificationMessage(someStr)); 
+1

¿Podría dar más detalles sobre por qué no quiere poner las instancias en MainView? –

+1

@Michael G, porque eso crea un fuerte acoplamiento entre esas vistas (que está en contra del patrón mvmm). Además, no es bueno crear una instancia de vm a la vista, esto debe hacerse en una ubicación centralizada, p. viewmodellocator (kit de herramientas mvvmlight). Realmente debe pensar en usar mvvmlight toolkit. He estado trabajando en una aplicación bastante compleja, y el kit de herramientas realmente me ha simplificado un montón de tareas. –

0

Si no es a 'exageración' para usted, usted puede pago y envío PRISM

Es una pauta con la biblioteca de aplicaciones compuestas utilizando MVVM y el MEF. Es una lib muy limpia, pero para proyectos pequeños podría ser demasiado grande.

+0

Gracias, estoy al tanto de PRISM; Sin embargo, no estoy seguro de cómo PRISM resolvería este problema de arquitectura. ¿Podrías apuntarme en la dirección correcta? –

1

De hecho, escribí algo recientemente relacionado con ese here. Es posible que esté interesado en echarle un vistazo.

Básicamente, si puede acceder a su valor de un RelativeSource de unión que es probablemente la forma más simple de hacerlo

Algo así como {Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainView}}, Path=DataContext.CustomerListViewModel.SelectedCustomer}

o implementar un sistema de mensajería que transmite un mensaje cada vez que el SelectedCustomer se cambia . MVVM Light Toolkit tiene una buena simple usando la clase Messenger, o Prism tenía la más avanzada EventAggregator.