0

我正在尝试使用 WPF 和 PRISM 创建 WPF 应用程序。我也在使用 MEF 和 mvvm。是否有可能有 2 个视图模型可以通过使用事件聚合器相互通信?例如。在视图模型 A 中发布并在视图模型 B 中订阅?如果是这样怎么办?我已经构建了一个具有多个视图模型的程序,其中一些视图模型应该相互通信,但是如果我使用 eventtaggregator 在 Viewmodel A 中发布,A 在 vi​​ewmodel B 中的订阅将永远不会被识别为属于同一个 eventtaggregator,所以我不能更新连接到视图模型 B 的视图。

4

5 回答 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 可以为您做到这一点:

  1. 您可以使用 PRISM 的 Unity 在构造函数中加载 EventAggregator

  2. 您可以使用 MEF 注入 EventAggregator 的引用

于 2012-03-30T06:15:50.597 回答
0

您是否使用 Wea​​kReference(弱订阅)进行订阅?如果是这样,并且您的订阅者没有在其他地方引用,它可能会在您发布事件之前被垃圾收集并消失。

于 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 回答