Pregunta

Estoy trabajando en una aplicación WPF y estoy usando el patrón Model-View-ViewModel

La aplicación consta de dos módulos en este momento:

  • Panel izquierdo para examinar un árbol y seleccionar un nodo
  • Panel principal para mostrar el contenido del nodo del árbol seleccionado.

Quiero mantener estos dos módulos separados, pero cuando selecciono un nodo en el Panel izquierdo, necesito activar un evento al que se pueda suscribir el Panel principal. No quiero acoplar el panel izquierdo y el panel principal, por lo que no quiero compartir instancias de las clases de ViewModel.

De forma óptima, me encantaría usar Prism (Guía de aplicaciones compuestas de WPF), pero actualmente estoy extendiendo una aplicación existente y no puedo introducir más dependencias. El proyecto también está en .NET 3.0 (no 3.5), así que tendría que volver a convertir Prism a .NET 3.0 como está escrito para .NET 3.5.

En Prism, resolvería esto utilizando la infraestructura de eventos de acoplamiento flexible. Le permite disparar un evento en cualquier clase en cualquier capa y escuchar cualquier evento en cualquier clase en cualquier capa. Básicamente se desacopla el editor y el suscriptor del evento.

Uso Comandos para lograr este acoplamiento suelto entre mi View y mi ViewModel, pero no estoy seguro de cómo hacer una comunicación adecuada de vista cruzada.

Cualquier consejo o sugerencia son muy apreciados.

Estoy buscando específicamente un realmente modelo de evento de publicación / sub de peso ligero para .NET 2.0 / 3.0 (sin cosas LINQ), o alguna otra cosa para implementar la vista cruzada (módulo ) Comunicación sin acoplar los dos módulos.

Actualización : terminé resolviendo esto de una manera similar a lo que Glen sugiere. Tengo un EventService separado (lo llamo CommandProxy) y lo paso a cada ViewModel a través de los constructores en mi localizador de servicios (en este momento estoy usando un Localizador de Servicios en lugar de un contenedor IoC). El CommandProxy expone un conjunto de MultiDelegateCommants, que es una extensión del DelegateCommand en Prism (Compuesto WPF Guidance). Básicamente, permite comandos que se desacoplan del árbol visual y que admiten múltiples suscriptores.

¿Fue útil?

Solución

¿Tienes un contenedor IoC? Un enfoque simple es crear un servicio personalizado que dispare el evento. El Agregador de eventos es genérico, pero puede crear un servicio específico que haga lo que quiera.

Por ejemplo, cree un EventingService que tenga un método OnNodeSelected. Ese método dispara un evento NodeSelected que cuelga del servicio. El servicio se registra en su contenedor IoC, lo que permite a los editores y suscriptores acceder a él. De esta manera, si su MainPanel necesita suscribirse, entonces su MainPanelViewModel se inyectará con EventingServiec en su constructor. A continuación, se suscribirá. Otro enfoque si está utilizando WPF es extraer el CompositeCommand del código de la biblioteca de aplicaciones compuestas y hacer que el servicio de eventos exponga un CompositeCommand. Luego, cada suscriptor (Ver modelo) registra su comando con el servicio. Cuando se llama a OnNodeSelected, se invoca la ejecución de CompositeCommand, por lo que se notifica a todas las partes interesadas.

Hablamos sobre el uso de su propio servicio para esto en los documentos para la Guía de aplicaciones compuestas en www.microsoft.com/compositewpf en la sección sobre eventos de acoplamiento libre en el tema Comunicación. ( http://msdn.microsoft.com/en-us/library/cc707836 .aspx ). Francis Cheung también tiene una publicación sobre esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top