2012-03-30 5 views
0

Ein gängiges Szenario, mit dem wir uns in unserer aktuellen Anwendung befassen, ist, wo wir mehrere Klassen routen und Ereignisse durchführen müssen.Routing eines Ereignisses durch mehrere Klassen in C#

Hier ist eine Beispiel Klassenhierarchie.

Action Mainwindow PresentationManager MenuManager Menü MenuButton

Das Menü abonniert dem Click-Ereignis eines MenuButton. Es erstellt dann ein CustomAction-Objekt und löst ein Ereignis aus, das für MenuManager abonniert ist. Im Ereignismanager MenuManager wird wiederum ein Ereignis ausgelöst, das vom PresentationManager abonniert wurde, und so weiter.

Hier ist ein Beispiel dessen, was für die PresentationManager implementiert:

void MenuManager_ActionGenerated(object sender, CustomActionEventArgs e) 
    { 
      if (ActionGenerated != null) 
       ActionGenerated(sender, e); 
    } 

Ich hatte gehofft, dass es eine Möglichkeit wäre, dass ich das Ereignis in der Menüebene erhöhen könnte und sie in der Action Ebene erhalten.

Ist es eine schlechte Übung, was ich gerade mache?

+0

Siehe diesen Artikel: http://weblogs.asp.net/vblasberg/archive/2010/03/30/wpf-routed-events-bubbling-several-layers-up .aspx – Diego

Antwort

0

Wenn das, was Sie als Ihre Klassenhierarchie aufgelistet haben, tatsächlich Ihr visueller Baum ist, klingt es wie das, was Sie beschreiben, geroutete Ereignisse.

http://msdn.microsoft.com/en-us/library/ms742806.aspx

Ich persönlich habe Angst durch eine Menge von Veranstaltungen mit. Wenn Sie nicht mit der Abmeldung vorsichtig sind, können sie die Lebensdauer Ihrer Objekte verlängern. Außerdem können sie eine enge Kopplung verursachen und die Testbarkeit verringern. In einigen Fällen ist die Verwendung eines Kommandomusters ein besserer Ansatz.

+0

Können Sie bitte ein Befehlsmuster beschreiben? – WPFNewbie

+0

Ich habe Probleme in der Vergangenheit mit Objekten, die für zwei lange Do to Event-Handler, ein schlechtes Leck in .NET. – WPFNewbie

+0

Dasselbe Konzept wie Ereignis Aggregator. Erstellen Sie Commanding in WPF - http://msdn.microsoft.com/de-de/library/ms752308.aspx. Bei vielen Frameworks (wie Prism) ist ein Event-Aggregator-Muster eingebaut. – foson

0

Sie können Ihre eigenen SubscriptionManager schreiben.

Durch die Vereinfachung kann ein Dicationary<string, List<Action<...>>> sein. Der Schlüssel ist der event-name, Wert ist der ListAction s zu laufen, der sogar angehoben wurde.

Alle yuor-Komponenten abonnieren also ein bestimmtes Ereignis, indem sie Action<..> der Liste des angegebenen Ereignisses hinzufügen.

Und wenn die gerade erhöht (immer über SubscriptionManager) alle Action<..> s aus der Liste ausgeführt wird.

Nur eine Grundidee. Um diese Produktion fertig zu machen, müssen Sie ein bisschen mehr programmieren.

Viel Glück.

+0

Ist das ähnlich dem Event-Aggregator, den GuyVdn erwähnt hat? Der ActionManager ist ein Dispatcher, der Aktionen in die Warteschlange stellt und diese dann zur Ausführung weitergibt. Ursprünglich haben wir versucht, dies zu einem Singleton zu machen, das alle unsere aktionsgenerierenden Objekte direkt aufrufen könnten, aber dann dachte ich, dass es eng gekoppelt ist. – WPFNewbie

+0

@WPFNewbie: Ich weiß nicht, Event Aggregator ', aber die erste aussehen * scheint * ähnlich. Der Unterschied ist, dass es hier keine "Öffentlicher" gibt. Alle Ereignisse sind fest in "SubscriptionManager" kodiert. Wie sieht es mit enger Kopplung aus: Jedem Ereignis ist eine Delegierte/Aktion zugeordnet. So ist es auch jetzt. Ich sehe also kein Problem darin, diese Art von Struktur zu haben. – Tigran

+0

Ich habe Bezug genommen, wenn wir unsere Action Dispatcher-Klasse zu einem Singleton gemacht haben, auf den jedes Element direkt zugreift und seine Aktion in die Warteschlange stellt. Der Action Dispatcher würde es dann wie einen Router für Ereignisse versenden. Dies würde erfordern, dass jede Klasse die Action Dispatcher-Klasse kennt und eng gekoppelt ist. – WPFNewbie

Verwandte Themen