Prism中两个RegisterViewWithRegion重载之间的区别是什么

时间:2011-05-03 17:00:53

标签: prism

我正在使用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集合中。

2 个答案:

答案 0 :(得分:3)

您可能遇到的问题是,使用typeof方法,Module类正在进行GC,因此没有订户可用。

使用另一种方法,当您生成一个lambda来注册该区域中的视图时,Module类应该悬空。

事件聚合器有一个选项可以使引用保持活动状态(不使用弱引用),这应该可以解决问题。

答案 1 :(得分:0)

也许ViewA的依赖关系在你没有从容器中抓取时没有得到解决?