C#事件传递/冒泡

时间:2010-02-06 18:49:40

标签: c# .net events

我订阅Event内的class。如

MainStation mainStation = StationFactory.GetMainStation();  
mainStation.FrequencyChanged += new EventArgs(MainStation_FrequencyChanged);

我的MainStation课程通过调用事件FrequencyChanged()

在某种情况下引发事件

问题

现在我有一个场景,我必须SubStation实例化MainStationMainStation也是FrequencyChanged的子类,并带有一些其他功能{{1}必须将事件订阅为MainStation子请求。考虑下面提到的代码:

public class MainStation
{
    public event EventHandler FrequencyChanged;
    public static SubStation CreateSubStation()
    {
        SubStation subStation = new SubStation();
        //here I want to pass/bubble FrequencyChanged event to SubStation
        subStation.FrequencyChanged = FrequencyChanged; //THIS IS WRONG
    }
}

底线
我想触发一个类从另一个类订阅的事件,也冒泡事件

更新
StationFactory创建MainStationFrequencyChanged实例中的MainStation事件设置为第一个代码块中定义的。

3 个答案:

答案 0 :(得分:7)

如果FrequencyChanged不属于MainStation,而是属于某些Base,那么您将不得不链接并展示您感兴趣的事件。

public class MainStation : Base
{
    public event EventHandler StationFrequencyChanged;

    public MainStation()
    {
        // ...

        this.FrequencyChanged += new EventHandler(MainStation_FrequencyChanged);
    }

    void MainStation_FrequencyChanged(object sender, EventArgs e)
    {
        if (StationFrequencyChanged != null)
            StationFrequencyChanged(sender, e);
    }

    public void GetEventsFrom(MainStation src)
    {
        //this is where you assign src events to your object
        this.StationFrequencyChanged = src.StationFrequencyChanged;
    }

    public static SubStation CreateSubStation(MainStation main)
    {
        SubStation subStation = new SubStation();

        //register events    
        subStation.GetEventsFrom(main);

        return subStation;
    } 
}

public class SubStation : MainStation
{

} 

答案 1 :(得分:0)

如果您需要更灵活的东西,可以使用WPF RoutedEvents。

或者手动实现类似的方法:将对象组织到树中并编写可以从树节点向上路由事件的事件管理器。如果树层次结构符合您的需求,那么比在处理程序中转发每个单独的事件更方便和可预测。

答案 2 :(得分:0)

如果您的CreateSubStation方法不是静态的,那么您拥有的代码将按预期工作。 (前提是MainStation上的事件处理程序是在创建Substation之前设置的......这不是一个很棒的设计,IMO。)