【问题标题】:Avoid Breaking MVVM with TreeView and HierarchicalDataTemplate避免使用 TreeView 和 HierarchicalDataTemplate 破坏 MVVM
【发布时间】:2011-03-04 17:31:21
【问题描述】:

我有一个我正在尝试使用 MVVM 模式设计的应用程序。在我的模型中,我有组和案例。一个组可能包含其他组以及案例。现在,我想在我的视图中的 TreeView 中显示这些。因此,由于组可能包含其他组和案例,因此树最终可能看起来像这样:

--
----案例
----案例
--
----
----案例
--案例
案例

我的 View 附加到一个 ViewModel,其中包含一个 ObservableCollection 组。我的问题是,我可以让 TreeView 按我的意愿显示的唯一方法是在指向数据类型(组或案例)的资源中使用 HierarchicalDataTemplate,我觉得这会破坏 MVVM(视图应该在哪里不知道模型)。

这行得通:

 <UserControl.Resources>
    <HierarchicalDataTemplate DataType="{x:Type models:Group}" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding GroupName}" />
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type models:Case}">
        <TextBlock Text="{Binding CaseName}" />
    </DataTemplate>
</UserControl.Resources>

对于 TreeView:

<TreeView ItemsSource="{Binding AvailableCaseGroups}" />

这是否破坏了 MVVM 的精神?否则我该怎么做?

【问题讨论】:

    标签: c# wpf visual-studio-2010 mvvm


    【解决方案1】:

    如果 View 知道 ViewModel,我认为它根本不会破坏 MVVM。 当然,在视图中使用模型详细信息对于 MVVM 来说是不合适的。 要解决这个问题,您可以构建一些 ViewModel 的层次结构 - MainViewModel -- GroupViewModel g1 ---GroupViewModel g1a ---CaseViewModel c1b -- GroupVieModel g2 ... 然后它不再是您的模型的结构细节,而是您的 ViewModel 之一,并且可以被 View 使用。如果 Model 将来可能在结构上发生变化,变成一个平面列表或什么的,你的 ViewModel 仍然可以坚持旧的层次结构(转换 Model)并且你的 View 仍然有效。

    【讨论】:

    • 问题是视图通过这种方式知道模型。在真正的 MVVM 中,View 应该只知道 ViewModel,而 ViewModel 应该处理与 Model 的所有交互。
    • 啊,感谢您澄清这一点,我读错了。当然,在视图中使用模型详细信息对于 MVVM 来说是不合适的。要解决这个问题,您可以构建 ViewModels 的一些层次结构 - MainViewModel -- GroupViewModel g1 ---GroupViewModel g1a ---CaseViewModel c1b -- GroupVieModel g2 ...然后它不再是模型的结构细节,而是其中之一你的 ViewModel 并且可以被 View 使用。如果 Model 将来可能在结构上发生变化,变成一个平面列表或什么的,你的 ViewModel 仍然可以坚持旧的层次结构(转换 Model)并且你的 View 仍然有效。
    • 好建议。我会试试看。您介意编辑原始答案以反映这一点吗?这样如果成功的话我可以接受。
    【解决方案2】:

    我有多个层次数据模板的类似情况,并使用模板选择器为树中的适当级别选择适当的模板。

    我的数据遇到的问题是树视图分为 3 个级别,每个级别都在具有不同绑定/属性的不同类中。

    在这种情况下,我认为它并没有真正破坏 MVVM 的精神,因为有时视图必须知道它绑定到的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多