【问题标题】:Prism 2 SL : Remove View from Region when button clickedPrism 2 SL:单击按钮时从区域中删除视图
【发布时间】:2009-03-16 17:49:59
【问题描述】:

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

视图模型正在接收命令,但视图模型没有对区域管理器的引用。

视图模型应该知道区域管理器吗?即使视图模型有对它的引用,它也需要将视图实例传递给包含区域的 deactive 方法。

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

【问题讨论】:

    标签: silverlight mvvm prism


    【解决方案1】:

    我将在这里冒个险,假设您正在为您的区域使用 itemscontrol 等,因为这是“删除视图的按钮”的最明显用法。

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

    Controller 自己接收 IRegionManager 并找到它负责的 Region。

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

    【讨论】:

    • 这是一个欢迎屏幕,当用户单击按钮时 - 我希望它消失,向他们展示主应用程序视图。我使用的区域只是一个内容控件。将视图所属的 IModule 用作控制器是否有意义 - 看到它是注册视图的那个?
    • 在这种情况下,我会说是的。您的视图模型可以使用 EventAggregator(Prism SL 中是否存在?)向负责它需要丢弃视图的任何对象发出信号。这样一来,您的视图/视图模型就可以很好地与管理区域的实际工作隔离开来。
    • 酷——我曾考虑过使用一个事件将视图模型与区域管理器分离——也许可以创建一个通用事件,当它需要被停用时,它可以被任何视图触发。视图模型如何获得对视图的引用以便传递它?
    【解决方案2】:

    EventAggregator 在您的情况下(需要自行卸载的控件)可能是一种矫枉过正,因为将IRegionManager 简单地注入到该控件视图模型构造函数中

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

    然后是这样的

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

    应该做你要求的事情。

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

    【讨论】:

    • 我不想让我的观点知道任何关于(依赖于)区域或区域经理的事情
    • 您不要在视图中添加此代码,而是将其添加到视图模型(表示模型)中,恕我直言可以获取 IRegionManager。但如果你想保持“纯粹”的方式,Jeremy 的屏幕激活器可能是要走的路codebetter.com/blogs/jeremy.miller/archive/2009/09/07/…
    • 模拟接口有什么特别之处吗?你在里面塞进很多流行语,却收效甚微。
    【解决方案3】:

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

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

    【讨论】:

    • 你是放弃了所有的 Prism 还是仅仅放弃了 Region 的东西?
    • 我们删除了 PRISM 框架组件,只使用指南(文档)来创建事件子系统(与事件聚合器的工作方式相同)。我们计划在 PRISM 框架更加成熟并获得更广泛的支持后重新添加它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多