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

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

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

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

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

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

谢谢。

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

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

正确的方法是在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章中有更详细的解释; 他们还有一个如何工作的说明 ,这是非常好的,因为它还可以让你知道你可以在哪里挂钩和如何。

它在内部查找区域的ActiveViews属性中的View。 如果它不存在,它会创建一个新的并将其添加到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); } } } }