2010-02-24 90 views
20

是可以委派從內對象實例的corrent對象的事件處理程序的事件與這樣的語法:是否有可能在c#中「鏈」EventHandlers?

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; 
    } 
} 

對於上述結構的動機是,我有很多精靈般的UI流和想分開Back,Forward &取消對單個類的處理,以尊重設計中的開放閉合原則和單一責任原則。

添加一個方法OnFinish並進行常規檢查總是有可能的,但如果有很多嵌套事件,它會以很多樣板代碼結束。

回答

32

有兩種選擇。第一:

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

其次,你提到:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

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

第二形式的好處是,該事件的源,則似乎是中間類,而不是嚮導 - 這是合理因爲這是處理程序訂閱的內容。

+0

謝謝,第二個選項背後的原因足以以這種方式實現系統。並感謝第一個選項,因爲我沒有意識到有一個語法來重載add。 – plouh 2010-02-24 07:40:19

+0

出於好奇,爲什麼在測試null和調用Finish之前將Finish分配給處理程序? – dckrooney 2011-06-28 20:39:30

+0

@dcrooney:應該調用處理程序。將編輯。 – 2011-06-28 20:55:42