使用带有 IsNavigationTarget 的 Prism 处理嵌套视图,它可以 return false

Working with nested views using Prism with IsNavigationTarget which can return false

我正在尝试为以下问题找到解决方案。我有一个 WPF 应用程序,我使用 mvvm 和 prism(最新版本 7)来构建它。这是我正在处理的 form/dialog 的草稿:

MainView 有区域 - region1,我根据树视图中 selected 的内容将 SubViewA 注入到 region1 中。此视图表示树项内容。 SubViewA itslef有region-region2,另一个view-SubViewB根据combobox注入到region2selection.

我使用 INavigationAware 来管理区域注入。

因此,为了将视图注入区域,我从 MainViewModel 使用以下内容:

_regionManager.RequestNavigate(regionName, viewName, callBack, parameters);

在 SubViewAViewModel 中,我实现了 INavigationAware,为了重用创建的视图,我检查是否创建了每个树项的视图。为此,我将一个 treeitemId 添加到参数中,然后我在 IsNavigationTarget 方法中检查此 id,如下所示:

bool IsNavigationTarget(NavigationContext navigationContext)
{
    // get id parameter from navigationContext.Parameters
    // check if subviewA for treeitemId was already shown and return true,
    // i use dictionary, where i store ids of all items that were selected in the past
    // otherwise return false.
}

我想将SubViewB注入SubViewA的区域2时使用的相同方法。大多数情况下,当用户更改下拉菜单时 selection 会注入新的 SubViewB。

现在我的问题是 - 如果我在 SubViewBViewModel 中使用 INavigationAware 并且当 IsNavigationTarget 总是 returns true - 一切都很好。当我尝试重用视图并再次选择 return true 或 false 时,当我 select 树视图中的第二个项目时,我得到一个异常:"Region with the given name is already registered" - prism 抱怨 region2 已经注册.

我知道我可以拥有服务并在显示视图时始终从服务中填充数据,因此我不需要重用视图。但这是更学术的问题 - 解决它的正确方法是什么?

P.S。我尝试注册作用域区域管理器,但没有成功,我的问题是我不知道创建新作用域管理器的最佳位置在哪里以及如何将其注入视图模型。 Parent 的 ViewModel 不是这样做的好地方,因为我必须公开视图。如果我尝试使用附加行为,那么似乎在调用行为之前更新了区域内容。

P.S.2 我从 pluralsight(由 Brian Lagunas)找到了一个例子,他在其中创建了两个 shell,但这与我想要实现的不同。他在创建 window 的那一刻为每个 window 创建了新的范围管理器。而且,如果 window 本身具有与我上面显示的相同的结构,它也会失败。

P.S.3 我看了 Brian Lagunas 最近的流媒体,他正在从头开始编写 outlook,他的方法基于行为,他将一些视图与相关视图相关联,效果很好,但又在他的示例相关视图不包含区域。

谢谢。

对细节有兴趣的朋友,请看以下pluralsight课程:pluralsight.pxf.io/XVxR5 & pluralsight.pxf.io/B6X99。一个是关于多个 shell 的,另一个是关于选项卡式控制的,它被称为 'Prism Problems & Solutions: Mastering TabControl' - 这个课程对我有帮助。

简而言之,问题是关于如何在主视图模型中注入范围区域。为了解决这个问题,我们重写了 ScopedRegionNavigationContentLoader plus 来控制我们要注入作用域区域管理器还是我们必须标记接口的全局区域管理器。

我创建了另一个与当前问题类似的问题:请检查 。它将为您提供更多详细信息。