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

时间:2011-02-25 09:17:40

标签: c# wpf prism-4

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

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分:19)

执行此操作的正确方法是在View或ViewModel中实现INavigationAware(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)
    {
    }
}

所有这些都在Prism 4文档的第8章中有更详细的解释;它们也有an illustration of how it works,这非常好,因为它还可以让您准确了解可以挂钩的位置和方式。

答案 1 :(得分:16)

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

public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
    public bool KeepAlive
    {
        get { return false; }
    }
}

答案 2 :(得分:1)

它在内部查找区域的 ActiveViews 属性中的视图。如果它不存在,它会创建一个新的并将其添加到 ActiveViews 以供将来使用。

要完成您要执行的操作,您需要在导航到任何视图之前删除或清除 ActiveView 集合。

实施例

public static class RegionManagerExtensions
{
    public static void RequestNavigateEx(this IRegionManager regionManager, String regionName, Uri source)
    {
        if (regionManager != null)
        {
            IRegion region = regionManager.Regions[regionName];

            if (region != null)
            {
                foreach (Object view in region.ActiveViews)
                {
                    region.Remove(view);
                }

                regionManager.RequestNavigate(regionName, source);
            }
        }
    }
}