如何在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); } } } }