C#事件传递/冒泡上升

4

我在一个 class 内部订阅了一个 Event。例如:

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

我的 MainStation 类根据某些条件触发事件,只需调用事件 FrequencyChanged()

问题

现在我有一个场景,必须从 MainStation 实例化 SubStation,后者也是 MainStation 的子类,具有一些额外的特性,并且必须订阅 MainStation 订阅的 FrequencyChanged 事件。请考虑下面的代码:

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 创建 MainStation,并且在 MainStation 实例中设置了 FrequencyChanged 事件,如第一个代码块所定义。


2
只是好奇为什么这是在社区维护模式下。看起来这是一个有明确答案的好问题。只是好奇... ;) - IAbstract
3个回答

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
{

} 

感谢Dynami的回复!看起来这正是我想要的。我现在无法测试代码,因为我正在移动中。我会尽快测试并告诉你。再次感谢! - Abdul Munim

0

如果您需要更灵活的内容,可以使用WPF路由事件。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接