我是 Prism 的新手,我正在尝试确定在 Prism 2 应用程序中停用视图的最佳实践——当用户单击视图上的按钮时,我想停用视图。单击按钮时视图正在执行命令。
视图模型正在接收命令,但视图模型没有对 regionmanager 的引用。
视图模型应该知道区域管理器吗?即使视图模型有对它的引用,它也需要将视图实例传递给包含区域的 deactive 方法。
我正在为应用程序使用 MVVM 模式。
我是 Prism 的新手,我正在尝试确定在 Prism 2 应用程序中停用视图的最佳实践——当用户单击视图上的按钮时,我想停用视图。单击按钮时视图正在执行命令。
视图模型正在接收命令,但视图模型没有对 regionmanager 的引用。
视图模型应该知道区域管理器吗?即使视图模型有对它的引用,它也需要将视图实例传递给包含区域的 deactive 方法。
我正在为应用程序使用 MVVM 模式。
我将在这里冒险并假设您正在为您的区域使用项目控件或类似的东西,因为这是“删除视图的按钮”的最明显用法。
在这种情况下,您应该有一个控制器(或任何您想称呼它的名称,但 Prism 团队似乎使用这种名称来承担这种责任)负责管理活动的 ViewModel,并且您可以显示您的视图使用 DataTemplates,或者在添加新实例时手动创建/添加/激活新视图。您的情况似乎是第二个,控制器应该负责管理视图。您的视图模型应该通过依赖注入获得对该控制器的引用,并要求它从活动模型/视图池中删除它。
Controller 本身接收到 IRegionManager 并找到它负责的 Region。
我希望这是有道理的,如果没有,请发表评论。
EventAggregator
在您的情况下(需要自行卸载的控件)可能是矫枉过正,因为简单IRegionManager
地注入该控件视图模型构造函数
ctor (IRegionManager regionManager)
{
this.RegionManager = regionManager
}
然后像这样
this.regionManager.Regions[regionName].Remove(this.View);
应该做你要求的事情。
IRegionManager
是可模拟的接口,可以轻松测试,它只是一种抽象,不会将您与实现耦合并启用 IoC。
我也挂在这里了。我发现,因为 RegionManager 负责它包含的区域,所以我最终会在我的 RegionManager 和我想要管理的区域之间实现紧密耦合。
从外部管理这些区域(比如从主应用程序菜单)是一项复杂的工作,因此我们放弃了 PRISM 框架,并基于在我们的特定场景中使用的复合应用程序指导元素编写了我们自己的代码。