[Silverlight入门系列]为什么Prism的IEventAggregator不工作

ewsshnng
2013-10-11 · TA获得超过4651个赞
知道大有可为答主
回答量:1069
采纳率:0%
帮助的人:2543万
展开全部
后来分析了原因,是因为MEF依赖注入没有设置正确。先说说Prism的事件机制吧。主要是用观察者模式实现了事件的发布和订阅解耦,在Prism中可以用在两个模块的相互通信,把事件的基类放在公共模块中即可。举例来说,先在公共模块中定义一个空的基于CompositePresentationEvent的强引用事件代理(这样的强引用方式+手工退订能获得最高的性能) 在公共模块定义公共事件接口using System; using Microsoft.Practices.Prism.Events; publicclass NavigateEvent : CompositePresentationEvent<string> { } 然后用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<NavigateEvent>().Publish("23456"); 订阅事件TheEventAggregator.GetEvent<NavigateEvent>().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<UserControl.DataContext><vm:MyViewModel/></UserControl.DataContext> 去除绑定,改为MEF导入[Import("MyViewModel")]
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式