后来分析了原因,是因为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")]