I'm trying to find solution for the following problem. I have a WPF app, I used mvvm and prism (most recent version 7) to build it. Here is the draft of the form/dialog I work on:
MainView 有区域 - Region1,我根据树视图中选择的内容将 SubViewA 注入到 Region1 中。该视图表示树项内容。 SubViewA 本身有区域 - 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 已注册。
我知道我可以拥有服务,并在显示视图时始终从服务填充数据,因此我不需要重用视图。但这是一个更学术的问题——解决这个问题的正确方法是什么?
附:我尝试注册作用域区域管理器,但没有成功,我的问题是我不知道创建新作用域管理器的最佳位置以及如何将其注入视图模型。父级的 ViewModel 不是执行此操作的好地方,因为我必须公开视图。如果我尝试使用附加行为,那么区域内容似乎会在调用行为之前更新。
P.S.2 我从pluralsight(由Brian Lagunas)找到了一个例子,他创建了两个shell,但它与我想要实现的目标不同。他在创建窗口时为每个窗口创建新的范围管理器。而且,如果窗口本身具有与上面所示相同的结构,它也会失败。
P.S.3 我观看了 Brian Lagunas 最近的直播,他正在从头开始编写 Outlook,他的方法基于行为,他将某些视图与依赖视图相关联,它工作得很好,但在他的示例中,依赖视图再次不包含区域。
谢谢。