复合视图 - 视图已存在于区域错误中

时间:2011-10-27 15:43:09

标签: c# wpf mef prism-4 avalondock

我正在研究WPF / Prism 4 / AvalonDoc应用程序。

我的一个观点非常复杂,ViewModel变得庞大且无法管理。因此我决定使用自己的ViewModel将其拆分为较小的视图。

我在视图上放置了一个区域,并使用“master”ViewModel构造函数中的regionManager.RegisterViewWithRegion方法将子视图加载到该区域。

当只加载一个视图实例时,它就像预期的那样工作。但是,当我打开该屏幕的第二个实例(它作为DocumentContent加载到AvalonDock的DocumentPane中)时,我收到“视图已存在于区域中”错误​​。

如果可能的话,我想避免给该地区一些独特的名字。 有没有办法表明我正在向“主”视图的特定实例添加子视图? 有关如何做到这一点的任何建议?

2 个答案:

答案 0 :(得分:1)

如果您使用的是MEF,您的视图是Singleton,即

[PartCreationPolicy(CreationPolicy.Shared)]

并且您的INavigationAware

上返回false
public override bool IsNavigationTarget(NavigationContext navigationContext)

{return false;}

您将收到此错误。

[PartCreationPolicy(CreationPolicy.Shared)]更改为[PartCreationPolicy(CreationPolicy.NonShared)]

你已经完成了。

答案 1 :(得分:0)

我担心你不能拥有几个同名的地区。当视图模型变得复杂时,我宁愿不拆分视图。您可以将视图模型拆分为多个专用视图模型。

一个例子。你有一个用户管理。一个视图模型是所有用户的列表。此列表包含用户视图模型。并且每个用户视图模型包含用户权限视图模型的实例,该模型本身又是仅表示一个用户权限的视图模型的列表。因此,如何呈现特殊用户权限的逻辑进入对应的视图模型而不进入“主”用户列表视图模型。这样,您可以将您的关注点分成不同的视图模型。

绑定到这些视图模型就像只有一个视图模型一样简单。只是路径越来越长了。当数据上下文是上面示例中的用户列表视图模型时,您可以使用类似CurrentUserVM.UserRightsVM的绑定路径来获取用户权限列表。

相关问题