Frage

Ich arbeite an einer WPF-Anwendung und verwende das Model-View-ViewModel-Muster.

Die Anwendung besteht derzeit aus zwei Modulen:

  • Linkes Feld, um einen Baum zu durchsuchen und einen Knoten auszuwählen
  • Hauptpanel, um den Inhalt des ausgewählten Baumknotens anzuzeigen.

Ich möchte diese beiden Module getrennt halten, aber wenn ich einen Knoten im linken Feld auswähle, muss ich ein Ereignis abfeuern, das das Hauptfeld abonnieren kann. Ich möchte die linke und das Hauptfeld nicht koppeln, daher möchte ich keine Instanzen der ViewModel -Klassen teilen.

Optimalerweise würde ich gerne Prism (WPF Composite Application Guidance) verwenden, aber ich erwte derzeit eine vorhandene Anwendung und kann keine Abhängigkeiten einführen. Das Projekt befindet sich auch auf .NET 3.0 (nicht 3.5), daher müsste ich Prisma zurück in .NET 3.0 umwandeln, da es für .NET 3.5 geschrieben ist.

In Prisma würde ich dies mit der lose gekoppelten Ereignisinfrastruktur lösen. Sie können ein Ereignis in einer beliebigen Klasse in einer beliebigen Ebene abfeuern und jedes Ereignis in einer beliebigen Klasse in einer beliebigen Ebene anhören. Grundsätzlich wird der Herausgeber und Abonnent der Veranstaltung entkoppelt.

Ich verwende Befehle, um diese lose Kopplung zwischen meiner Ansicht und meinem ViewModel zu erreichen, aber ich bin mir nicht sicher, wie man eine ordnungsgemäße Kreuzungskommunikation durchführt.

Tipps oder Vorschläge werden sehr geschätzt.

Ich suche speziell nach einem Ja wirklich Light Waage Pub/Sub -Ereignismodell für .NET 2.0/3.0 (kein LINQ -Zeug) oder etwas anderes, um die Kommunikation zwischen Cross View (Modul) zu implementieren, ohne die beiden Module zu koppeln.

Aktualisieren: Ich habe dies auf ähnliche Weise gelöst, was Glen vorschlägt. Ich habe einen separaten EventService (ich nenne es eine Befehlsproxy) und übergende das an jedes ViewModel durch die Konstrukteure in meinem Service-Locator (im Moment verwende ich einen Service-Locator anstelle eines IOC-Container). Die CommandProxy enthüllt eine Reihe von MultidelegateCommants, eine Erweiterung des Delegatektors im Prisma (Composite WPF -Leitlinien). Es ermöglicht im Grunde genommen Befehle, die vom visuellen Baum entkoppelt sind und mehrere Abonnenten unterstützt.

War es hilfreich?

Lösung

Haben Sie einen IOC -Behälter? Ein einfacher Ansatz besteht darin, einen benutzerdefinierten Dienst zu erstellen, der das Ereignis abfeuert. Der Ereignisaggregator ist generisch, aber Sie können einen bestimmten Dienst erstellen, der das tut, was Sie wollen.

Erstellen Sie beispielsweise einen EventingService mit einer Onnodeselected -Methode. Diese Methode feuert ein Knotenelement aus, das am Dienst hängt. Der Service wird dann in Ihrem IOC -Container registriert, mit dem Verleger und Abonnenten dazu kommen können. Wenn Sie sagen, dass Ihr Mainpanel abonnieren muss, wird Ihr MainpanelviewModel den EventingServiec in seinem Konstruktor injiziert. Es wird dann abonnieren. Ein weiterer Ansatz, wenn Sie WPF verwenden, besteht darin, den Compositecommand aus dem Composite App -Bibliothekscode zu ziehen und den Eventing -Dienst einen Compositecommand aufzudecken. Anschließend registriert jeder Abonnent (Ansichtsmodell) seinen Befehl mit dem Dienst. Wenn die Onnodeselected aufgerufen wird, wird die Ausführung des Compositecommand aufgerufen, wodurch alle interessierten Parteien benachrichtigt werden.

Wir sprechen in den Dokumenten für zusammengesetzte App -Anleitung unter www.microsoft.com/compositeWPF im Abschnitt zu locker gekoppelten Ereignissen im Kommunikationsthema in den Dokumenten. (http://msdn.microsoft.com/en-us/library/cc707836.aspx). Francis Cheung hat auch einen Beitrag dazu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top