我正在为我的新项目使用WPF4和PRISM4。
有一个模块,里面有几个视图。 DI完成统一。当我第一次从ViewA导航到ViewB时,会创建ViewB并调用其构造函数。但是当我第二次尝试导航到ViewB时,未创建ViewB,但重用了现有实例。
我正在使用 IRegionManager.RequestNavigate 进行导航。
我试图将 TransientLifeTimeManager 传递给 RegisterType Unity方法,但无济于事。
每次导航时,有没有办法配置棱镜和/或统一来创建新视图?
感谢。
答案 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);
}
}
}
}