我正在使用Prism4,在我的一个模块中,我正在尝试使用区域注册视图,并处理其按钮单击事件(当用户单击视图上的按钮时发布)。
public class MyModule : IModule
{
private readonly IUnityContainer container;
private readonly IRegionManager regionManager;
private readonly IEventAggregator eventAggregator;
public MyModule(IUnityContainer container, IRegionManager regionManager, IEventAggregator eventAggregator)
{
this.container = container;
this.regionManager = regionManager;
this.eventAggregator = eventAggregator;
eventAggregator.GetEvent<ViewAButtonClicked>().Subscribe(ViewAButtonClicked);
}
public void Initialize()
{
this.regionManager.RegisterViewWithRegion("MainRegion", typeof(ViewA));
// this 2nd overload would work fine
//this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<ViewA>());
}
public void ViewAButtonClicked()
{
// some handling code
// does *NOT* execute if using the 1st RegisterViewWithRegion overload
// executes if using the 2nd RegisterViewWithRegion overload
}
}
上面的代码工作正常,只是它没有执行ViewAButtonClicked方法。
如果我切换到使用其他重载(在上面的代码中注释掉),那么一切都按预期工作,ButtonClicked方法运行。
msdn的描述非常相似,我不确定为什么它会给我上面描述的不同行为。在处理按钮点击事件时,为什么一个工作而另一个不工作?
RegisterViewWithRegion(IRegionManager,String,Func&lt;(Of&lt;(Object&gt;)&gt;)): 将视图与区域相关联,使用委托来解析con的concreate实例?视图。当区域显示时,将调用此删除门,并将结果添加到该区域的视图集合中。
RegisterViewWithRegion(IRegionManager,String,Type): 通过注册类型将视图与区域相关联。当显示区域get时,将使用ServiceLocator将此类型解析为具体实例。该实例将添加到该区域的Views集合中。
答案 0 :(得分:3)
您可能遇到的问题是,使用typeof方法,Module类正在进行GC,因此没有订户可用。
使用另一种方法,当您生成一个lambda来注册该区域中的视图时,Module类应该悬空。
事件聚合器有一个选项可以使引用保持活动状态(不使用弱引用),这应该可以解决问题。
答案 1 :(得分:0)
也许ViewA的依赖关系在你没有从容器中抓取时没有得到解决?