棱镜2 SL:单击按钮时从区域中删除视图

时间:2009-03-16 17:49:59

标签: silverlight mvvm prism

我是Prism的新手,我正在尝试确定在Prism 2应用程序中停用视图的最佳实践 - 当用户单击视图上的按钮时我想停用视图。单击按钮时视图正在执行命令。

视图模型正在接收命令,但视图模型没有对regionmanager的引用。

视图模型是否应该了解区域经理?即使viewmodel有引用它,它也需要将视图实例传递给包含区域的deactive方法。

我正在为应用程序使用MVVM模式。

3 个答案:

答案 0 :(得分:4)

我会在这里继续假设您正在使用您所在地区的物品控制等,因为这是“删除视图的按钮”最明显的用途。

在这种情况下,你应该有一个控制器(或者你想要的任何控制器,但Prism团队似乎使用那种名称来承担这种责任)负责管理活动的ViewModels,或者你们使用DataTemplates显示视图,或者在添加新实例时手动创建/添加/激活新视图。 您的情况似乎是第二个,控制器应负责管理视图。您的viewmodel应通过依赖注入获取对该控制器的引用,并要求它将其从活动模型/视图池中删除。

Controller本身接收IRegionManager并找到它负责的Region。

我希望这是有道理的,如果没有,请发表评论。

答案 1 :(得分:2)

在您的情况下

EventAggregator(需要自行卸载的控件)可能是一种过度杀伤,因为将IRegionManager简单地注入到该控件视图模型构造函数

ctor (IRegionManager regionManager)
{
    this.RegionManager = regionManager
}

然后是这样的

this.regionManager.Regions[regionName].Remove(this.View);

应该做你要求的事情。

IRegionManager是可模拟的接口,可以轻松进行测试,它只是一种抽象,不会将您与实现和启用IoC联系起来。

答案 2 :(得分:0)

我也挂了这里。我发现因为RegionManager负责它所包含的区域,所以我最终得到了我的RegionManager和我想管理的区域之间的紧密耦合。

从外部管理这些区域(从主应用程序菜单)是一项复杂的工作,因此我们删除了PRISM框架并根据在我们的特定场景中使用的复合应用程序指南元素编写了我们自己的代码