【问题标题】:How to use mulitple ViewModels in one MainWindow如何在一个主窗口中使用多个 ViewModel
【发布时间】:2013-01-11 11:56:18
【问题描述】:

我在 WPF 中有一个 C# 项目。我以前使用过 MVC,现在我正在尝试将 MVVM 与 XAML 结合使用。

我有多个模型,我有一个带有 Tabitems 的 GUI 窗口,我有多个 ViewModel。 每个选项卡项都与每个模型相关,因此我为每个模型都有一个 ViewModel。

现在我想使用绑定(为什么还要使用 WPF/XAML)。如何在 ViewModel X 中将按钮绑定到命令?

例如:

  • 两种模型:房子和人
  • 视图:GUI 中的两个 TabItem,一个关于与房屋的所有交互的 TabItem,以及一个用于人的 TabItem。
  • 两个 ViewModel,与每个 TabItem 相关。
  • 我有一个要出售房屋的命令。

我看到很多代码只是绑定到命令的名称,但由于我有多个视图,而不仅仅是 1,我该怎么做?我应该创建 1 个 ViewModel 来处理所有其他 ViewModel 吗?

【问题讨论】:

  • 无法相信绑定到视图模型实例的 RoutedCommand 是多么复杂......
  • 1.是的,创建一个包含其他作为子属性的父视图模型。 2. 您可以使用分层命名空间,例如 ParentViewModel.ChildViewModel1.MyCommand

标签: wpf xaml mvvm viewmodel icommand


【解决方案1】:

我看到很多代码只是绑定到命令的名称,但由于我有多个视图,而不仅仅是 1 个,我该怎么做?

确保您了解绑定系统的工作原理。您正在绑定到 DataContext。因此,如果每个单独的选项卡都有单独的 DataContext 值集,那么您可以使用命令的名称进行绑定。

知道了这一点,您就可以继续使用已建立的模式。以我的拙见,我认为它会变得过于复杂。大多数 MVVM 开发人员都在将 View 与 ViewModel 的一对一关系应用到 ViewModel 中(尽管在谈论 UserControl 对象时事情变得很棘手)。不过,没有什么是一成不变的,所以最终取决于您要如何进行。

【讨论】:

    【解决方案2】:

    我猜你的视图模型数量有限。所以你有两个选择:第一个是使用DataTemplateSelector,第二个是在xaml中定义每个TabItem视图并将每个Content绑定到必要的VM。

    【讨论】:

    • 如何将公共类视图模型的实例绑定到 Tabitem 并在该特定类中单击按钮时调用 ICommand?
    • 每个视图都应该有特定的虚拟机。您的 MainViewModel 看起来就像您在 xaml 中定义的层次结构。这里有不错的文章MSDN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多