[Silverlight入门系列]为什么Prism的IEventAggregator不工作
展开全部
后来分析了原因,是因为MEF依赖注入没有设置正确。先说说Prism的事件机制吧。主要是用观察者模式实现了事件的发布和订阅解耦,在Prism中可以用在两个模块的相互通信,把事件的基类放在公共模块中即可。举例来说,先在公共模块中定义一个空的基于CompositePresentationEvent的强引用事件代理(这样的强引用方式+手工退订能获得最高的性能) 在公共模块定义公共事件接口using System;
using Microsoft.Practices.Prism.Events;
publicclass NavigateEvent : CompositePresentationEvent { } 然后用MEF依赖注入MefEventAggregator,你可以使用属性注入,也可以使用构造器注入。(注意:必须使用[Import]的方式构造实例,否则,例如用Context在xaml绑定则MEF不工作) MEF属性注入[Import]
public IEventAggregator TheEventAggregator { privateget; set; } MEF构造器注入private IEventAggregator TheEventAggregator;
[ImportingConstructor]
public MyViewModel(IEventAggregator eventAggregator){TheEventAggregator = eventAggregator;
} 一旦MEF得到了EventAggregator,就可以用Subscribe和Publish方法来订阅和发布事件了。例如: 发布事件TheEventAggregator.GetEvent().Publish("23456"); 订阅事件TheEventAggregator.GetEvent().Subscribe(MyMethod, ThreadOption.UIThread, true);
publicvoid MyMethod(string abc){//TODO:} 注意订阅的时候有几个参数,例如指定是否在UIThread,是否keepSubscriberReferenceAlive,如果你希望GC不释放你的事件引用,选择keepSubscriberReferenceAlive=true, 否则,请实现IDisposable接口,在Dispose方法中退订事件: Unsubscribe(FundAddedEventHandler)。另外一个参数是过滤Filter,在Silverlight上使用week references时不支持事件过滤为Lambda表达式,可用一个方法代替,详见这个页面。用法应该很简单,为什么不工作呢?原来发现我在两个ViewModel中实现了事件的订阅和发布,他们都是MEF Export出来了,相应的View也是MEF Export的。但我在View里xaml直接绑定了ViewModel为DataContext而没有用MEF注入的方式,去除xaml中DataContext绑定,改成在xaml.cs中手工MEF注入ViewModel就解决问题了。 ViewModel绑定,没有用MEF 去除绑定,改为MEF导入[Import("MyViewModel")]
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询