首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每次在PRISM中导航时创建一个新视图?

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

Stack Overflow用户
提问于 2011-02-25 09:17:39
回答 3查看 8.4K关注 0票数 6

我在我的新项目中使用了WPF4和PRISM4。

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

我将IRegionManager.RequestNavigate用于导航目的。

我试图将TransientLifeTimeManager传递给RegisterType统一方法,但没有结果。

是否有一种方法来配置棱镜和/或统一,以便在每次导航到它时创建一个新的视图?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-25 15:28:44

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

代码语言:javascript
复制
public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
    public bool KeepAlive
    {
        get { return false; }
    }
}
票数 17
EN

Stack Overflow用户

发布于 2011-03-04 12:50:46

正确的方法是在视图或ViewModel中实现ViewModel (Prism将首先检查视图,如果不实现INavigationAware,也会检查ViewModel)。

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

代码语言:javascript
复制
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,这非常好,因为它还让您知道您可以准确地连接到哪里以及如何连接。

票数 20
EN

Stack Overflow用户

发布于 2011-02-25 09:50:23

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

要完成您想要做的事情,您需要在导航到任何视图之前删除或清除ActiveView集合。

示例:

代码语言:javascript
复制
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);
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5115484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档