代码之家  ›  专栏  ›  技术社区  ›  Greg Beech

在MVVM中,视图模型之间的耦合程度是合适的

  •  4
  • Greg Beech  · 技术社区  · 14 年前

    我正在开发一个相当简单的WPF应用程序来显示对象层次结构以及所选对象的详细信息,其中 UserControl 包扎 TreeView 在左窗格(树控件)和另一个 用户控制 包扎 ListView / GridView 在右侧(详细信息控件)。

    树控件使用MVVM跟踪 this Josh Smith article 相当接近,并且有许多ViewModel类型都是从相同的基类型派生的, TreeViewModel . 主窗口使用 MainWindowViewModel 如在 this Josh Smith article 并暴露 树型模型 用于填充第一代树控件。

    但是,当我想要填充右侧的详细信息窗格时,我遇到的问题是 SelectedItem 树控件的派生自 树型模型 当我需要一个完全不同类型的视图模型用于详细信息窗格时,它将使用反射将对象扩展到属性/值表中。

    所以,问题:

    1. 它适合 主窗口视图模型 揭露 树型模型 用于树控制?我相信这里的答案是肯定的,但是我愿意接受相反的建议。

    2. 树控件中的选定项应如何适应“详细信息”窗格的右视图模型类型?一个选择似乎是 主窗口视图模型 跟踪树中的选定项并进行自适应,将其作为另一个属性公开,但我不确定是否有更好的解决方案。

    我不熟悉wpf和mvvm模式,所以请原谅这个问题的基本性质。我已经做了一些关于模式背景的阅读,查看了一些示例应用程序等,但是我找不到足够具体的东西来让我对答案充满信心。我也意识到对于这么简单的应用程序来说,MVVM可能是多余的,但我将它部分地用作学习练习。

    3 回复  |  直到 14 年前
        1
  •  1
  •   TomTom    14 年前

    1.主窗口视图模型是否适合公开 树控件的TreeView模型?

    我相信是的。模型应该隐藏外观的逻辑,但它不能隐藏类似thigns的逻辑结构。

    2.树控件中的选定项应如何适应右侧 详细信息窗格的视图模型类型? 一个选择似乎是 主窗口视图模型跟踪 树中的选定项并执行 适应,将其作为另一个 但我不确定是否有 更好的解决方案。

    嗯,不是。

        2
  •  0
  •   Grozz    14 年前

    在研究类似的问题时,我得出的结论是

    object Tag { get; set; }
    

    属性是不可避免的:(除了一些罕见的情况(整个树视图中只有一种类型的对象)。

        3
  •  0
  •   Robert Rossney    14 年前

    但是,当我想要填充右侧的详细信息窗格时,我有一个问题,即当我需要一个完全不同类型的视图模型用于详细信息窗格时,树控件的SelectedItem是从TreeViewModel派生的,该视图模型将使用反射将对象扩展到属性/值表中。

    如果您真的非常关心这个问题,那么您可以构建一个高阶视图模型类,它公开两个不同的属性——一个是类型 TreeViewModel 类型之一 DetailsViewModel . 然后主窗口的视图模型将向树控件和细节控件公开相同的对象,但这两种视图类型的逻辑结构将相互分离。

    从逻辑上讲,树控件中选定的项和详细信息控件中显示的项是相同的。尽管详细信息控件不显示有关该对象的父/子关系的信息,而树控件也不显示有关该对象的名称/值对的信息,但它仍然是相同的。对于表示一个事物的单个对象公开一个只有该事物的一个视图使用的属性这一事实,可能真的不需要太担心。