我正在研究WPF / Prism 4 / AvalonDoc应用程序。
我的一个观点非常复杂,ViewModel变得庞大且无法管理。因此我决定使用自己的ViewModel将其拆分为较小的视图。
我在视图上放置了一个区域,并使用“master”ViewModel构造函数中的regionManager.RegisterViewWithRegion方法将子视图加载到该区域。
当只加载一个视图实例时,它就像预期的那样工作。但是,当我打开该屏幕的第二个实例(它作为DocumentContent加载到AvalonDock的DocumentPane中)时,我收到“视图已存在于区域中”错误。
如果可能的话,我想避免给该地区一些独特的名字。 有没有办法表明我正在向“主”视图的特定实例添加子视图? 有关如何做到这一点的任何建议?
答案 0 :(得分:1)
如果您使用的是MEF,您的视图是Singleton,即
[PartCreationPolicy(CreationPolicy.Shared)]
并且您的INavigationAware
在
public override bool IsNavigationTarget(NavigationContext navigationContext)
{return false;}
您将收到此错误。
将[PartCreationPolicy(CreationPolicy.Shared)]
更改为[PartCreationPolicy(CreationPolicy.NonShared)]
你已经完成了。
答案 1 :(得分:0)
我担心你不能拥有几个同名的地区。当视图模型变得复杂时,我宁愿不拆分视图。您可以将视图模型拆分为多个专用视图模型。
一个例子。你有一个用户管理。一个视图模型是所有用户的列表。此列表包含用户视图模型。并且每个用户视图模型包含用户权限视图模型的实例,该模型本身又是仅表示一个用户权限的视图模型的列表。因此,如何呈现特殊用户权限的逻辑进入对应的视图模型而不进入“主”用户列表视图模型。这样,您可以将您的关注点分成不同的视图模型。
绑定到这些视图模型就像只有一个视图模型一样简单。只是路径越来越长了。当数据上下文是上面示例中的用户列表视图模型时,您可以使用类似CurrentUserVM.UserRightsVM的绑定路径来获取用户权限列表。