2008-10-20 11 views
23

Ich habe mehrere Ebenen in einer Anwendung und ich finde, dass ich Ereignisse auf der GUI - Ebene platzen lassen muss, um Änderungen an der Statusleiste usw. . Ich finde, dass ich wiederholt codierte schreiben muss, wobei jede Schicht einfach Ereignisse von der unteren Schicht abonniert und dann im Rückruf einfach ein Ereignis in der Kette anhebt. Gibt es einen effizienteren Weg, dies zu tun?Sprudelnde Ereignisse.

Antwort

29

Wenn Sie nur einen Event-Handler von einem anderen Event-Handler auslösen, können Sie den mittleren Mann ausschneiden und die Event-Handler direkt in den add/remove-Blöcken für das Event haken.

Zum Beispiel, wenn Sie ein Benutzersteuerelement mit einem „SaveButtonClick“ Ereignis, und alle wollen Sie wann zu tun ist, um die Event-Handler aufrufen, wenn die „Savebutton“ auf Ihrem Usercontrol geklickt wird, können Sie dies tun:

public event EventHandler SaveButtonClick 
{ 
    add { this.SaveButton.Click += value; } 
    remove { this.SaveButton.Click -= value; } 
} 

Jetzt benötigen Sie keinen Code zum Auslösen des SaveButtonClick-Ereignisses - es wird automatisch ausgelöst, wenn das SaveButton.Click-Ereignis ausgelöst wird (dh wenn jemand auf diese Schaltfläche klickt).

+0

Das klingt interessant. Würde mich freuen, die Umsetzung zu sehen. –

+0

@Maxim - der Code, den ich dort gepostet habe * ist * die Implementierung. Wenn Sie ein UserControl mit einer Schaltfläche namens SaveButton haben und diese UC in ein Formular einfügen, können Sie SaveButtonClick über das Formular abonnieren. Wenn Sie auf die Schaltfläche klicken, wird Ihr Event-Handler aufgerufen. –

+0

Ich mag die Idee und einfache Implementierung. aber ich mag nicht die Abhängigkeit, die Sie zwischen dem usercontrol und dem Teilnehmer erstellen –

0

Sie können einen zentralen Kanal verwenden, der nur Ereignisse unterstützt. Dieser Kanal muss unabhängig sein, sodass die Ebene nur veröffentlicht oder abonniert wird.

+1

Das klingt interessant, aber die Erklärung ist sehr vage. Kannst du ein paar Beispiele geben? – spoulson

1

Es sei denn, ich sehe ein bisschen mehr vom Design .. es wird schwer sein, eine gute Antwort zu geben.

WPF führt Bubble-Ereignisse (automatisch) die UI-Komponente/Control-Struktur ... Dies wurde jetzt in das Framework eingebaut. Also ich denke, das ist die empfohlene Methode :)

Das Problem mit der Umgehung des mittleren Mannes Layer2 ist, dass Layer1 und Layer3 jetzt einander kennen ... sind gekoppelt. Es ist also ein Kompromiss. Wenn Sie mit der Kopplung in Ordnung sind .. eliminieren Sie den mittleren Mann/erfinden Sie eine spezialisierte Komponente mit dieser Verantwortung. Wenn Sie jedoch erwarten, dass Layer 3 Hot-Swap-fähig ist (niedrige Kopplung), würde ich sagen, dass Sie weiter blubbern.

0

Werfen Sie einen Blick auf Update Controls .NET. Diese Steuerelemente ermitteln die Teile Ihres Datenmodells, von denen sie selbst durch Schichten der Geschäftslogik abhängen. Sie müssen keinen Code schreiben, um sie zu benachrichtigen.

3

Lesen Sie sich Jeremy Millers Blog "The Shade Tree Developer" durch, vor allem seine Write Your Own CAB series - das Befehlsmuster, über das er spricht, ist wahrscheinlich das, was Sie brauchen.