Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么时候应该在事件聚合器上使用事件处理程序?_C#_Wpf_Mvvm_Event Handling_Eventaggregator - Fatal编程技术网

C# 什么时候应该在事件聚合器上使用事件处理程序?

C# 什么时候应该在事件聚合器上使用事件处理程序?,c#,wpf,mvvm,event-handling,eventaggregator,C#,Wpf,Mvvm,Event Handling,Eventaggregator,什么时候应该使用事件处理程序而不是事件聚合器 在我的代码中,我有两个由父视图模型控制的视图模型,我试图决定是否应该使用事件处理程序在它们之间进行对话?或者使用事件聚合器?这将只是一个简单的方法调用,我不需要在它们之间传递参数。在我看来,EventAggregator通常是当您想要将事件发布到整个应用程序时使用的重炮,更具体地说,当您不知道到底是谁在监听时 在您的场景中,情况并非如此,您有两个视图模型想要通信,但它们彼此都知道。因此,没有真正的理由不能使用事件 我只想提一下,如果您想让它更松散地耦

什么时候应该使用事件处理程序而不是事件聚合器


在我的代码中,我有两个由父视图模型控制的视图模型,我试图决定是否应该使用事件处理程序在它们之间进行对话?或者使用事件聚合器?这将只是一个简单的方法调用,我不需要在它们之间传递参数。

在我看来,EventAggregator通常是当您想要将事件发布到整个应用程序时使用的重炮,更具体地说,当您不知道到底是谁在监听时

在您的场景中,情况并非如此,您有两个视图模型想要通信,但它们彼此都知道。因此,没有真正的理由不能使用
事件


我只想提一下,如果您想让它更松散地耦合,那么为每个公开事件的viewmodels创建一个接口。这样,每个虚拟机将使用另一个虚拟机的接口,而不是特定的实例

这里有一个链接,其中包含一些有用的信息(从2019年5月起一直有效)。。。 (微软,Prism)

“做出关键决策”部分描述了何时使用它

NET中的事件实现发布-订阅模式。发布服务器和订阅服务器的生存期通过对象引用相互耦合,订阅服务器类型必须具有对发布服务器类型的引用

事件聚合是一种设计模式,它支持不方便通过对象和类型引用链接的类之间的通信。这种机制允许发布者和订阅者进行通信,而无需相互引用。因此,.NET事件应用于已经具有对象引用关系的组件(如控件和包含它的页面)之间的通信,事件聚合用于松散耦合组件(如应用程序中的两个独立页面视图模型)之间的通信。有关更多信息,请参阅事件聚合


我粗略地认为,这表明C#事件对层(听总线逻辑的UI)或父/子(听其包含的设备的仪器)有好处,而事件聚合对同级(例如同级UI面板或设备到设备通信)有好处.

你能用一个例子来解释最后一节吗?我的最后一节主要是相关的,如果你使用某种类型的,例如,你不知道谁实现了一个特定的接口,你只知道接口本身。因此在本例中,您将有两个接口
IVM1
IVM2
,每个接口都有一个事件
VM1
(实现了
IVM1
)不知道
VM2
,他只知道
IVM2
,但是由于事件是在
IVM2
上声明的,这就足够了。视图模型不必两者都知道对方。