如何在PRISM中每次导航时创建新视图?

Val*_*yev 5 c# wpf prism-4

我正在为我的新项目使用WPF4和PRISM4.

有一个模块,里面有几个视图.DI完成统一.当我第一次从ViewA导航到ViewB时,会创建ViewB并调用其构造函数.但是当我第二次尝试导航到ViewB时,未创建ViewB,但重用了现有实例.

我正在使用IRegionManager.RequestNavigate进行导航.

我试图将TransientLifeTimeManager传递给RegisterType Unity方法,但无济于事.

有没有办法在每次导航时配置棱镜和/或统一来创建新视图?

谢谢.

Jon*_*Jon 20

执行此操作的正确方法INavigationAware是在View或ViewModel中实现(Prism将首先检查视图,如果未实现INavigationAware,则还将检查ViewModel).

您特别感兴趣的是该IsNavigationTarget方法,该方法告诉Prism是否应重用View的当前实例,或者是否应创建另一个实例来满足导航请求.因此,要始终创建一个新视图,您将执行以下操作:

public class MyViewModel : INavigationAware {
    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
    {
        return false;
    }

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些都在Prism 4文档的第8章中有更详细的解释; 他们还有一个如何工作的插图,这非常好,因为它也让你知道你可以在哪里挂钩和如何.

  • 一个小的附录,如果使用MEF进行依赖注入,你应该确保你的视图具有属性`[PartCreationPolicy(CreationPolicy.NonShared)`.否则,无论`IsNavigateTarget`逻辑如何,`ServiceLocator`都将返回相同的实例.导航服务看到该区域已包含该实例并激活它.我困惑了很久. (2认同)

Ela*_*atz 16

这样做的方法是在你的视图或viewModel上实现IRegionMemberLifetime,并在布尔属性KeepAlive中返回false,如下所示:

public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
    public bool KeepAlive
    {
        get { return false; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不太正确,因为它有副作用,如果用户通过UI切换活动视图,那么您的`EmployeeDetailsView`将从该区域中删除,而不是简单地被停用. (4认同)