C# 不断涌现的事件。

C# 不断涌现的事件。,c#,winforms,events,C#,Winforms,Events,我在一个应用程序中有多个层,我发现自己必须在GUI层中弹出事件,以进行状态栏更改等。我发现自己必须编写重复的代码,其中每一层只需订阅来自较低层的事件,然后在回调中只需向上引发一个事件链。有没有更有效的方法可以做到这一点?您可以有一个只支持事件的中央频道。此通道必须是独立的,因此层只能发布或订阅它。如果您所做的只是从另一个事件处理程序触发事件处理程序,则可以删除中间人,直接在事件的“添加/删除”块中挂接事件处理程序 例如,如果您有一个带有“SaveButtonClick”事件的UserContro

我在一个应用程序中有多个层,我发现自己必须在GUI层中弹出事件,以进行状态栏更改等。我发现自己必须编写重复的代码,其中每一层只需订阅来自较低层的事件,然后在回调中只需向上引发一个事件链。有没有更有效的方法可以做到这一点?

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

如果您所做的只是从另一个事件处理程序触发事件处理程序,则可以删除中间人,直接在事件的“添加/删除”块中挂接事件处理程序

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

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

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

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

WPF不会(自动)在UI组件/控件树中弹出事件。。。这一点现已纳入框架。所以我想这是推荐的方法:)


绕过中间人层2的麻烦在于层1和层3现在相互认识了。。。它们是耦合的。所以这是一种折衷。。如果你对联轴器没意见。。消除中间人/发明一个专门负责此任务的组件。但是,如果您希望第3层是热插拔的(低耦合),我会说继续冒泡。

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

阅读Jeremy Miller的博客“树荫树开发人员”,尤其是他的-他所说的命令模式可能就是您所需要的。

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


这听起来很有趣,但解释很模糊。你能举几个例子吗?听起来很有趣。希望看到实现。@Maxim-我在那里发布的代码就是实现。如果您有一个名为SaveButton的按钮的UserControl,并且您将该UC放到表单上,您可以从表单订阅SaveButtonClick,并且每当单击该按钮时,您的事件处理程序都将被调用。我喜欢这个想法和简单的实现。但是我不喜欢你在usercontrol和subscriberthe按钮之间创建的依赖关系,按钮是订阅者的一部分,但是,如果没有usercontrol,按钮将不存在,所以依赖性很好。