2008-10-20 112 views
23

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

回答

29

如果你正在做的是从另一个事件处理程序中触发一个事件处理程序,那么可以裁剪掉中间人并直接在事件的add/remove块中挂接事件处理程序。

例如,如果你有一个“SaveButtonClick”事件用户控件,以及所有你想做的事时,就是调用事件处理程序上点击你的用户控件的“SaveButton”的时候,你可以这样做:

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

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

+0

听起来很有趣。希望看到实施。 – 2008-10-20 02:55:56

0

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

+1

这听起来很有趣,但解释很模糊。你能举一些例子吗? – spoulson 2008-10-20 01:43:36

1

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

WPF确实(自动)将UI组件/控件树冒泡起来......现在已经内置到框架中了。所以我想这是推荐的方式:)

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

0

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

3

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