2010-02-24 17 views
20

Ist es möglich, Ereignisse von innerer Objektinstanz corrent Objekts Event-Handler mit einer Syntax wie folgt zu delegieren:Ist es möglich, EventHandler in C# zu "ketten"?

public class MyControl { 
    public event EventHandler Finish; 

    private Wizard wizard; 
    public MyControl(Wizard wizard) { 
     this.wizard = wizard; 

     // some other initialization going on here... 

     // THIS is what I want to do to chain events 
     this.wizard.Finish += Finish; 
    } 
} 

Die Motivation für die oben genannte Struktur ist, dass ich viele Assistenten-ähnlichen Benutzeroberfläche Ströme habe und wollte trennen die Rückseite, Forward & Brechen Sie Behandlung zu einer einzelnen Klasse ab, um zu respektieren Offenes geschlossenes Prinzip und einzelnes verantwortliches Prinzip in meinem Entwurf.

Hinzufügen einer Methode OnFinish und die normale Überprüfung gibt es immer möglich, aber für den Fall, dass es viele verschachtelte Ereignisse gibt, wird es am Ende mit viel Vortex-Code enden.

Antwort

32

Zwei Optionen. Erstens:

public event EventHandler Finish 
{ 
    add { wizard.Finish += value; } 
    remove { wizard.Finish -= value; } 
} 

Zweitens, wie Sie erwähnen:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

private void WizardFinished(object sender, EventArgs e) 
{ 
    EventHandler handler = Finish; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

Der Vorteil der zweiten Form ist, dass die Quelle des Ereignisses dann die Zwischenklasse zu sein scheint, nicht der Assistent - was sinnvoll ist so haben sich die Handler angemeldet.

+0

Dank, die Begründung hinter der zweiten Option ist gut genug, um das System auf diese Weise zu implementieren. Und danke für die erste Option auch, da ich nicht wusste, dass es eine Syntax zum Überladen von Add gibt. – plouh

+0

Aus Neugier, wieso weisen Sie dem Handler Finish zu, bevor Sie auf Null testen und Finish aufrufen? – dckrooney

+0

@dcrooney: Das sollte Handler stattdessen aufgerufen haben. Wird bearbeiten. –

Verwandte Themen