2010-02-24 63 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