5

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

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

我使用IRegionManager.RequestNavigate进行导航。

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

有没有办法配置 prism 和/或 unity 以在我每次导航到它时创建一个新视图?

谢谢。

4

3 回答 3

20

正确的方法INavigationAware是在您的 View 或 ViewModel 中实现(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 章中进行了更详细的解释;他们还提供了它如何工作的说明,这非常好,因为它还可以让您确切地知道可以在哪里以及如何连接。

于 2011-03-04T12:50:46.437 回答
16

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

public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
    public bool KeepAlive
    {
        get { return false; }
    }
}
于 2011-02-25T15:28:44.230 回答
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);
            }
        }
    }
}
于 2011-02-25T09:50:23.477 回答