【问题标题】:WPF Prism V2 Using M-V-VM - Add a view at runtime to a region from the ViewModelWPF Prism V2 使用 M-V-VM - 在运行时将视图从 ViewModel 添加到区域
【发布时间】:2009-05-25 11:35:36
【问题描述】:

希望非常简单,我第一次尝试使用 Prism V2 使用 M-V-VM 的 WPF,到目前为止发现一切都非常棒。我的 Shell 非常简单,顶部是 Ribbon Control,左侧是帮助台工单的 DataGrid,右侧是 TabControl。

当用户从数据网格打开选定的工单时,我希望工单作为选项卡控件上的选项卡打开。我知道为了做到这一点,我需要使用 RegionManager 添加并激活该区域的视图。但是从 ViewModel 执行此操作对我来说似乎不正确,尽管我可以使用 DI (DepenecyInjection) 执行此操作,但它仍然在我的脑海中敲响警报,让 ViewModel 了解有关视图的一些知识。

为此,不同的模块还将向 TabControl 添加其他视图(联系人、客户端等),我想使用 DataTemplates 让 TabControl 正确显示视图,谁能给我任何指针这个也是。

非常感谢 本

请提供完整的答案,而不仅仅是链接。这就是 StackOverflow 的用途!

【问题讨论】:

  • 我想确认一下我在这里的两个问题。在运行时以编程方式向区域添加视图的最佳位置在哪里?以及如何设置 Region 以使用 DataTemplates,结合 M-V-VM 和 Prism 来根据 ViewModel 选择要使用的 View?

标签: wpf mvvm dependency-injection prism


【解决方案1】:

MVVM + 服务 = 终极力量!

服务只是一个众所周知的接口,并在您的 IOC 容器中注册。当 ViewModel 需要在自身之外做一些事情时,比如打开一个选项卡式文档,它会使用该服务。然后根据特定程序的需要实施服务。

例如:

public interface IDocumentService
{
    void OpenDocument(IViewModel viewModel);
}

internal class DocumentService:IDocumentService
{
    public void OpenDocument(IViewModel viewModel)
    {
        // Implement code to select the View for the ViewModel,
        // and add it to your TabControl.
    }
}

{
    // Somewhere in your ViewModel...
    // Make sure you can get the IDocumentService
    IDocumentService docService = ioc.Get<IDocumentService>();
    docService.OpenDocument(new TicketViewModel());
}

【讨论】:

    【解决方案2】:

    命令是执行此操作的方法 - 您将向自己发送一个名为“RequestBringTicketIntoView”的命令;它会冒泡到您处理它的窗口。阅读 Josh Smith 的文章:

    http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/

    【讨论】:

    • 我不这么认为。我想要的是将 View 的新实例与 ViewModel 一起添加到 shell 中的不同区域的操作。您不能将路由命令与 M-V-VM 模式一起使用,并且由于新视图需要知道在新视图中显示什么,我认为它需要在 ViewModel 中完成。
    • “您不能将路由命令与 M-V-VM 模式一起使用”为什么不呢?
    • 如果我错了,请纠正我,我只是通过我不久前读过的东西。路由命令在可视树中冒泡。 M-V-VM 模式中的 ViewModel 不是 Visual Tree 的一部分,并不意味着知道任何关于它的事情。
    • 如果您使用的是 Prism,那么您可以将按钮控件上的 Command 属性绑定到可以设置为视图模型中的附加属性的 DelegateCommand。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多