PRISM MEF通过在wpf中使用Eventaggregator从viewmodel到viewmodel进行通信

时间:2012-03-30 04:39:23

标签: wpf mvvm prism mef eventaggregator

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

5 个答案:

答案 0 :(得分:1)

这是定义Event Aggregator

的基本关键步骤

(1)创建Event Agg ..

public class YourEvent:CompositePresentationEvent {

}

(2)Publisher vm

eventAggregator.Get()出版(对象);

(3)订阅Vm

YourEvent eventobj = eventAggregator.Get();

    if (subscriptionToken != null)
    {
        eventobj.Unsubscribe(subscriptionToken);
    }

    subscriptionToken = eventobj.Subscribe(YourEventHandler, ThreadOption.UIThread, false, yourfun);

答案 1 :(得分:0)

唯一的可能性是ViewModel" B"尚未加载或尚未订阅该活动。如果不是这样,我建议你粘贴一些片段。

答案 2 :(得分:0)

您使用WeakReference订阅(弱订阅)吗?如果是这样,并且您的订户未在其他地方引用,则可能会在您发布活动之前收集垃圾并消失。

答案 3 :(得分:0)

EventAggregator始终相同,您必须传递每个Viewmodel。 Prism和MEF可以为你做到这一点:

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

  2. 您可以使用MEF

  3. 注入EventAggregator的引用

答案 4 :(得分:0)

您是否有ViewModel“B”和ViewModel“A”的实例?您是否在订阅代码运行之前发布了该事件?他们是否发布/订阅同一个活动?

EventAggregator.GetEvent(Of MyEventType).Subscribe(Sub()

                                                   End Sub)