MVVM中ViewModels之间的耦合程度是多少

时间:2010-11-23 10:14:43

标签: wpf mvvm viewmodel

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

树控件使用this Josh Smith article之后的MVVM,并且有许多ViewModel类型都来自相同的基类型TreeViewModel。主窗口使用this Josh Smith article中的MainWindowViewModel进行设置,并公开用于填充第一代树控件的TreeViewModel

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

所以,问题:

  1. MainWindowViewModel是否适合为树控件公开TreeViewModel?我相信这里的答案是肯定的,但我愿意接受相反的建议。

  2. 如何将树控件中的选定项目调整为详细信息窗格的右侧ViewModel类型?一个选项似乎是MainWindowViewModel跟踪树中的选定项并进行调整,将其作为另一个属性公开,但我不确定是否有更好的解决方案。

  3. 我是WPF和MVVM模式的新手,所以请原谅问题的相当基本性质。我已经做了一些关于模式背景的阅读,看了一些示例应用程序等但我找不到任何具体的东西让我对答案充满信心。我也意识到MVVM可能对应用程序来说太过分了,但我将其部分用作学习练习。

3 个答案:

答案 0 :(得分:1)

  

1. MainWindowViewModel是否适合公开   用于树控件的TreeViewModel?

我相信是的。模型应隐藏逻辑FOR THE LOOK的外观,但它不能隐藏逻辑结构之类的东西。

  

2.如何将树控件中的选定项目调整到右侧   ViewModel类型是否为详细信息窗格?   一种选择似乎是   MainWindowViewModel跟踪   在树中选择项目并执行   适应,将其暴露为另一种   财产,但我不确定是否有   一个更好的解决方案。

恕我直言。

答案 1 :(得分:0)

在处理类似的问题时,我得出结论

object Tag { get; set; }

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

答案 2 :(得分:0)

  

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

如果你真的非常关心这一点,你可以构建一个高阶视图模型类,它暴露两个不同的属性 - 一个是TreeViewModel类型,另一个是类型DetailsViewModel。然后主窗口的视图模型将同一对象暴露给树控件和细节控件,但两种视图类型的逻辑结构将彼此分离。

逻辑上,树控件中的所选项目和出现在详细信息控件中的项目是相同的。虽然细节控件不提供有关该事物的父/子关系的信息,并且树控件不提供有关该事物的名称/值对的信息,但它仍然是相同的。可能没有必要过分关注这样一个事实:表示一个东西的单个对象暴露了一个只有该东西的一个视图使用的属性。