1

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

MainView 具有区域 - region1,我根据树视图中选择的内容将 SubViewA 注入到 region1。此视图表示树项内容。SubViewA itslef 具有区域 - region2,另一个视图 - SubViewB 基于组合框选择被注入到 region2 中。

我使用 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 时,我使用的方法相同。大多数情况下,当用户更改下拉选择时,会注入新的 SubViewB。

现在我的问题是——如果我在 SubViewBViewModel 中使用 INavigationAware 并且当 IsNavigationTarget 总是返回 true 时——一切都很好。当我尝试重用视图并再次选择返回 true 或 false 时,当我在树视图中选择第二个项目时,出现异常:“具有给定名称的区域已注册” - prism 抱怨 region2 已注册。

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

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

PS2 我从复数视觉(Brian Lagunas)中找到了一个示例,他在其中创建了两个外壳,但它与我想要实现的不同。他在创建窗口的那一刻为每个窗口创建新的范围管理器。而且,如果窗口本身具有与我上面显示的相同的结构,它也会失败。

PS3 我观看了 Brian Lagunas 最近从头开始编写前景的流媒体,他的方法基于行为,他将一些视图与依赖视图相关联,它工作正常,但在他的示例中,依赖视图再次不包含区域。

谢谢你。

4

1 回答 1

0

对细节感兴趣的小伙伴可以看看以下pluralsight课程:pluralsight.pxf.io/XVxR5 &pluralsight.pxf.io/B6X99。一个是关于多个 shell 的,另一个是关于选项卡式控制的,它被称为“棱镜问题和解决方案:掌握 TabControl”——这门课程帮助了我。

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

我创建了另一个与当前问题类似的问题:请检查Prism 7 throws and exception when working with nested views。它会给你更多的细节。

于 2020-09-16T13:39:37.567 回答