Question

Je travaille sur une application WPF et utilise le modèle Model-View-ViewModel.

L'application est actuellement composée de deux modules:

  • Panneau de gauche pour parcourir une arborescence et sélectionner un nœud
  • Panneau principal pour afficher le contenu du nœud d'arborescence sélectionné.

Je souhaite que ces deux modules soient séparés, mais lorsque je sélectionne un nœud dans le panneau de gauche, je dois déclencher un événement auquel le panneau principal peut s'abonner. Je ne souhaite pas coupler les panneaux de gauche et principal, je ne souhaite donc pas partager les instances des classes ViewModel.

De manière optimale, j'aimerais utiliser Prism (Guide de l'application composite WPF), mais j'étends actuellement une application existante et je ne peux pas introduire davantage de dépendances. Le projet est également sur .NET 3.0 (et non 3.5). Je devrais donc reconvertir Prism en .NET 3.0, car il est écrit pour .NET 3.5.

Dans Prism, je résoudrais cela à l’aide de l’infrastructure d’événement à couplage lâche. Il vous permet de déclencher un événement dans n'importe quelle classe de n'importe quel calque et d'écouter n'importe quel événement dans n'importe quelle classe de n'importe quel calque. Fondamentalement, l'éditeur et l'abonné de l'événement sont découplés.

J'utilise des commandes pour réaliser ce couplage lâche entre mon View et mon ViewModel, mais je ne suis pas sûr de savoir comment faire une bonne communication entre vues.

Tous les conseils ou suggestions sont grandement appréciés.

Je recherche spécifiquement un vraiment modèle d'événement Pub / Sub Light pour .NET 2.0 / 3.0 (aucun élément LINQ), ou quelque chose d'autre pour implémenter une vue croisée (module ) communication sans coupler les deux modules.

Mise à jour : j'ai finalement résolu le problème de la même manière que ce que suggère Glen. J'ai un EventService séparé (je l'appelle un CommandProxy) et le transmets à chaque ViewModel via les constructeurs de mon localisateur de services (pour le moment, j'utilise un localisateur de services au lieu d'un conteneur IoC). CommandProxy expose un ensemble de MultiDelegateCommants, qui est une extension de DelegateCommand dans Prism (Composite WPF Guidance). Cela permet essentiellement aux commandes découplées de Visual Tree et prenant en charge plusieurs abonnés.

Était-ce utile?

La solution

Avez-vous un conteneur IoC? Une approche simple consiste à créer un service personnalisé qui déclenche l'événement. Event Aggregator est générique, mais vous pouvez créer un service spécifique qui fait ce que vous voulez.

Par exemple, créez un EventingService ayant une méthode OnNodeSelected. Cette méthode déclenche un événement NodeSelected qui bloque le service. Le service est ensuite enregistré dans votre conteneur IoC, ce qui permet aux éditeurs et aux abonnés d'y accéder. Ainsi, si par exemple votre MainPanel doit s'abonner, votre MainPanelViewModel sera injecté avec EventingServiec dans son constructeur. Il s'abonnera ensuite. Une autre approche si vous utilisez WPF consiste à extraire CompositeCommand du code Composite App Library et à ce que le service de gestion des événements expose une CompositeCommand. Ensuite, chaque abonné (View Model) enregistre sa commande auprès du service. Lorsque OnNodeSelected est appelé, l'exécution de la CompositeCommand est appelée, ce qui en informe toutes les parties intéressées.

Nous expliquons comment utiliser votre propre service à cet effet dans la documentation pour Composite App Guidance à l'adresse www.microsoft.com/compositewpf, dans la section Evénements à couplage lâche de la rubrique Communication. ( http://msdn.microsoft.com/en-us/library/cc707836 .aspx ). Francis Cheung a également publié un article à ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top