我订阅Event
内的class
。如
MainStation mainStation = StationFactory.GetMainStation();
mainStation.FrequencyChanged += new EventArgs(MainStation_FrequencyChanged);
我的MainStation
课程通过调用事件FrequencyChanged()
问题
现在我有一个场景,我必须从SubStation
实例化MainStation
,MainStation
也是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
创建MainStation
,FrequencyChanged
实例中的MainStation
事件设置为第一个代码块中定义的。
答案 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。)