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

C# 如何在每次在PRISM中进行导航时创建新视图?,c#,wpf,prism-4,C#,Wpf,Prism 4,我正在为我的新项目使用WPF4和PRISM4 一个模块中有多个视图。DI是统一完成的。当我第一次从ViewA导航到ViewB时,将创建ViewB并调用其构造函数。但是,当我第二次、第三次尝试导航到ViewB时,不会创建ViewB,而是重用现有实例 我正在使用IRegionManager.RequestNavigate进行导航 我尝试将TransientLifeTimeManager传递给RegisterType Unity方法,但没有效果 是否有办法配置prism和/或unity,以便在每次导航

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

一个模块中有多个视图。DI是统一完成的。当我第一次从ViewA导航到ViewB时,将创建ViewB并调用其构造函数。但是,当我第二次、第三次尝试导航到ViewB时,不会创建ViewB,而是重用现有实例

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

我尝试将TransientLifeTimeManager传递给RegisterType Unity方法,但没有效果

是否有办法配置prism和/或unity,以便在每次导航时创建新视图


谢谢。

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

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

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

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

正确的方法是在视图或ViewModel中实现
INavigationAware
(Prism将首先检查视图,如果它没有实现
INavigationAware
,它还将检查ViewModel)

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

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

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
    }
}

Prism 4文档的第8章对所有这些进行了更详细的解释;他们也有,这是非常好的,因为它还可以让你确切地知道你可以挂在哪里以及如何挂上。

这不太正确,因为它有一个副作用,如果用户通过UI切换活动视图,那么您的
EmployeeDetailsView
将从该区域中删除,而不是简单地被停用。我确实假设他想在导航视图时删除视图,如果我错了,他会纠正我。我们对他的要求做出了不同的解释——我真的不明白为什么这会让你投-1票,好像我的回答不正确。嘿,我试着这么做,结果是一片空白。是否缺少某些内容?视图不必存在于活动视图属性中;如果视图存在于Views属性中,则不会重新创建该视图。如果使用MEF进行依赖项注入,则应确保视图具有属性
[PartCreationPolicy(CreationPolicy.NonShared)
。否则,
ServiceLocator
将返回相同的实例,而不管
IsNavigateTarget
逻辑如何。导航服务发现该区域已经包含该实例并将其激活。我困惑了很长时间。这实际上解决了我的相反问题。我的条件不正确,因此返回false总是
public class MyViewModel : INavigationAware {
    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
    {
        return false;
    }

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
    }
}