我在我的新项目中使用了WPF4和PRISM4。
有一个模块,其中包含多个视图。DI是统一完成的。当我第一次从ViewA导航到ViewB时,会创建ViewB并调用它的构造函数。但是,当我第二次、第三次尝试导航到ViewB时,没有创建ViewB,而是重用现有实例。
我将IRegionManager.RequestNavigate用于导航目的。
我试图将TransientLifeTimeManager传递给RegisterType统一方法,但没有结果。
是否有一种方法来配置棱镜和/或统一,以便在每次导航到它时创建一个新的视图?
谢谢。
发布于 2011-02-25 15:28:44
这样做的方法是在视图或IRegionMemberLifetime上实现viewModel,并在布尔属性KeepAlive中返回false,如下所示:
public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
public bool KeepAlive
{
get { return false; }
}
}发布于 2011-03-04 12:50:46
正确的方法是在视图或ViewModel中实现ViewModel (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章中作了更详细的解释;它们也有an illustration of how it works,这非常好,因为它还让您知道您可以准确地连接到哪里以及如何连接。
发布于 2011-02-25 09:50:23
它在内部查找区域的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);
}
}
}
}https://stackoverflow.com/questions/5115484
复制相似问题