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

本文关键字:视图 区域 错误 于区域 存在 复合 | 更新日期: 2023-09-27 18:12:30

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

我的一个视图非常复杂,ViewModel变得巨大且难以管理。所以我决定把它分成更小的视图,它们有自己的viewmodel。

我在视图上放置了一个区域,并使用regionManager将子视图加载到该区域。从"master" ViewModel构造器中获取RegisterViewWithRegion方法。

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

如果可能的话,我想避免给区域一个唯一的名称。是否有一种方法可以表明我正在添加子视图到"主"视图的特定实例?有什么建议吗?

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

如果您正在使用MEF并且您的视图是Singleton,即

[PartCreationPolicy(CreationPolicy.Shared)]

和你的INavigationAware

返回false
public override bool IsNavigationTarget(NavigationContext navigationContext)

{返回false;}

你会得到这个错误。

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

恐怕您不能有几个具有相同名称的区域。当视图模型变得复杂时,我宁愿不要拆分视图。您可以将视图模型拆分为几个专门的视图模型。

一个例子。您有一个用户管理。一个视图模型是所有用户的列表。此列表包含用户视图模型。每个用户视图模型包含一个用户权限视图模型的实例,它本身也是一个视图模型的列表,它只表示一个用户权限。因此,关于如何呈现特殊用户权限的逻辑将进入相应的视图模型,而不是进入"主"用户列表视图模型。这样你就可以把你的关注点分离到不同的视图模型中。

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