我正在尝试使用 WPF 和 PRISM 创建 WPF 应用程序。我也在使用 MEF 和 mvvm。是否有可能有 2 个视图模型可以通过使用事件聚合器相互通信?例如。在视图模型 A 中发布并在视图模型 B 中订阅?如果是这样怎么办?我已经构建了一个具有多个视图模型的程序,其中一些视图模型应该相互通信,但是如果我使用 eventtaggregator 在 Viewmodel A 中发布,A 在 viewmodel B 中的订阅将永远不会被识别为属于同一个 eventtaggregator,所以我不能更新连接到视图模型 B 的视图。
问问题
1122 次
5 回答
1
这是定义事件聚合器的基本关键步骤
(1) 创建事件集..
公共类 YourEvent: CompositePresentationEvent {
}
(2) 发布者虚拟机
eventAggregator.Get().Publish(object);
(3) 订阅虚拟机
YourEvent eventobj = eventAggregator.Get();
if (subscriptionToken != null)
{
eventobj.Unsubscribe(subscriptionToken);
}
subscriptionToken = eventobj.Subscribe(YourEventHandler, ThreadOption.UIThread, false, yourfun);
于 2012-03-30T05:12:19.913 回答
0
唯一的可能是 ViewModel "B" 未加载或尚未订阅事件。如果这不是真的,我建议你粘贴一些片段。
于 2012-03-30T04:52:58.610 回答
0
EventAggregator 总是相同的,你必须将它传递给每个 Viewmodel。Prism 和 MEF 可以为您做到这一点:
您可以使用 PRISM 的 Unity 在构造函数中加载 EventAggregator
您可以使用 MEF 注入 EventAggregator 的引用
于 2012-03-30T06:15:50.597 回答
0
您是否使用 WeakReference(弱订阅)进行订阅?如果是这样,并且您的订阅者没有在其他地方引用,它可能会在您发布事件之前被垃圾收集并消失。
于 2012-03-30T04:55:17.250 回答
0
你有 ViewModel "B" 和 ViewModel "A" 的实例吗?您是否在订阅代码运行之前发布事件?他们是否都发布/订阅同一个事件?
EventAggregator.GetEvent(Of MyEventType).Subscribe(Sub()
End Sub)
于 2013-12-09T16:55:39.633 回答