鼓泡事件。

时间:2008-10-20 00:48:04

标签: c# winforms events

我在应用程序中有多个图层,我发现自己必须将事件冒泡到GUI层以进行状态栏更改等。 。我发现自己必须编写重复编码,其中每一层简单地订阅来自较低层的事件,然后在回调中简单地向上引发一个事件。有没有更有效的方法呢?

6 个答案:

答案 0 :(得分:30)

如果您所做的只是从另一个事件处理程序触发事件处理程序,您可以删除中间人并将事件处理程序直接挂钩到事件的添加/删除块中。

例如,如果您有一个带有“SaveButtonClick”事件的UserControl,并且在单击UserControl上的“SaveButton”时调用事件处理程序时想要执行的操作,则可以执行以下操作:

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

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

答案 1 :(得分:3)

阅读Jeremy Miller的博客“The Shade Tree Developer”,特别是他的Write Your Own CAB series - 他谈到的命令模式可能就是你需要的东西。

答案 2 :(得分:3)

Peter Rilling发布了一种模拟winforms中的事件冒泡/广播的方法。 它简单而有效。

http://www.codeproject.com/KB/cs/event_broadcast.aspx

答案 3 :(得分:1)

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

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

绕过中间人Layer2的麻烦是Layer1和Layer3现在互相认识......是耦合的。所以这是一个权衡..如果你对联轴器没问题那么......消除中间人/发明一个有这个责任的专门组件。但是,如果您希望第3层是可热插拔的(低耦合),我会说继续冒泡。

答案 4 :(得分:0)

您可以拥有仅支持活动的中央频道。此频道必须是独立的,因此图层仅发布或订阅它。

答案 5 :(得分:0)

看看Update Controls .NET。这些控件通过业务逻辑层发现它们依赖的数据模型部分。您不必编写任何代码来通知他们。