事件冒泡

30

我在应用程序中有多个层级,发现自己不得不将事件传递到GUI层进行状态栏更改等操作。我发现自己不得不编写重复的代码,每个层级只是从下面的层级订阅事件,然后在回调中将事件向上传递。是否有更有效的方法来完成这项工作?

6个回答

35

如果你只是从另一个事件处理程序中触发事件处理程序,你可以省略中间人,并在事件的 add/remove 块中直接挂钩事件处理程序。

例如,如果你有一个包含“SaveButtonClick”事件的 UserControl,并且当单击 UserControl 上的“SaveButton”时只想调用事件处理程序,可以这样做:

public event EventHandler SaveButtonClick
{
    add { this.SaveButton.Click += value; }
    remove { this.SaveButton.Click -= value; }
}

现在你不需要任何代码来触发SaveButtonClick事件 - 当SaveButton.Click事件被触发时(即当有人点击该按钮时),它将自动触发。


听起来很有趣。很想看到实现过程。 - Maxime Rouiller
@Maxim - 我在那里发布的代码 就是 实现。如果你有一个名为 SaveButton 的按钮的 UserControl 并将其拖放到表单上,你可以从表单订阅 SaveButtonClick,每当按钮被点击时,你的事件处理程序将被调用。 - Matt Hamilton
我喜欢这个想法和简单的实现方式。但是我不喜欢你在用户控件和订阅者之间创建的依赖关系。 - Peter Gfader
3
按钮是用户的一部分,也就是说,如果没有用户控制,按钮将不存在,因此依赖关系是正确的。 - Sekhat

3

3
请阅读Jeremy Miller的博客"The Shade Tree Developer",特别是他的"Write Your Own CAB"系列 - 他在那里谈论的命令模式可能是您需要的。请参考这里

1

除非我看到更多的设计,否则很难给出一个好的答案。

WPF会自动向上冒泡事件到UI组件/控件树...这已经内置在框架中。所以我猜这是推荐的方式 :)

绕过中间层Layer2的麻烦是,Layer1和Layer3现在互相了解...被耦合起来了。所以这是一种权衡...如果你可以接受这种耦合...就消除中间层/发明一个具有这种职责的专用组件。然而,如果您希望第3层是可热插拔的(低耦合),我建议继续冒泡。


0

您可以拥有一个仅支持事件的中央通道。该通道必须是独立的,因此层只能发布或订阅它。


1
这听起来很有趣,但解释非常模糊。你能给一些例子吗? - spoulson

0

看看 Update Controls .NET。这些控件可以发现它们依赖于数据模型的哪些部分,即使经过多层业务逻辑也是如此。你不需要编写 任何 代码来通知它们。


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