我在应用程序中有多个层级,发现自己不得不将事件传递到GUI层进行状态栏更改等操作。我发现自己不得不编写重复的代码,每个层级只是从下面的层级订阅事件,然后在回调中将事件向上传递。是否有更有效的方法来完成这项工作?
如果你只是从另一个事件处理程序中触发事件处理程序,你可以省略中间人,并在事件的 add/remove 块中直接挂钩事件处理程序。
例如,如果你有一个包含“SaveButtonClick”事件的 UserControl,并且当单击 UserControl 上的“SaveButton”时只想调用事件处理程序,可以这样做:
public event EventHandler SaveButtonClick
{
add { this.SaveButton.Click += value; }
remove { this.SaveButton.Click -= value; }
}
现在你不需要任何代码来触发SaveButtonClick事件 - 当SaveButton.Click事件被触发时(即当有人点击该按钮时),它将自动触发。
Peter Rilling发布了一种在winforms中模拟事件冒泡/广播的方法。
它简单而有效。
除非我看到更多的设计,否则很难给出一个好的答案。
WPF会自动向上冒泡事件到UI组件/控件树...这已经内置在框架中。所以我猜这是推荐的方式 :)
绕过中间层Layer2的麻烦是,Layer1和Layer3现在互相了解...被耦合起来了。所以这是一种权衡...如果你可以接受这种耦合...就消除中间层/发明一个具有这种职责的专用组件。然而,如果您希望第3层是可热插拔的(低耦合),我建议继续冒泡。
您可以拥有一个仅支持事件的中央通道。该通道必须是独立的,因此层只能发布或订阅它。