2

我正在开发 WPF/Prism 4/AvalonDoc 应用程序。

我的一个观点非常复杂,ViewModel 变得庞大而难以管理。所以我决定用他们自己的 ViewModel 把它拆分成更小的视图。

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

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

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

4

2 回答 2

1

如果您使用的是 MEF 并且您的视图是单例,即

[PartCreationPolicy(CreationPolicy.Shared)]

你的INavigationAware回报是假的

public override bool IsNavigationTarget(NavigationContext navigationContext)

{返回错误;}

你会得到这个错误。

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

你就完成了。

于 2013-03-22T14:26:51.667 回答
0

我担心你不能有多个同名的区域。当视图模型变得复杂时,我不希望拆分视图。您可以将视图模型拆分为几个专门的视图模型。

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

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

于 2011-10-28T07:47:08.840 回答