2010-11-23 57 views
4

我正在开发一个相当简单的WPF应用程序来显示对象层次结构和所选对象的详细信息,UserControl在左窗格(树形控件)中包含TreeView,并且另一个UserControl在右侧包装ListView/GridView(细节控制)。MVVM中的ViewModels适合多少

树控件使用MVVM后面的this Josh Smith article相当接近,并且有许多ViewModel类型都来源于相同的基类型TreeViewModel。主窗口使用MainWindowViewModel设置,如this Josh Smith article,并公开用于填充第一代树控件的TreeViewModel

然而,当我要填充的详细信息窗格的权利,我有树控制的SelectedItemTreeViewModel衍生当我需要一个完全不同类型的视图模型为详细信息窗格中,将扩大问题使用反射将对象映射到属性/值的表中。

所以,问题:

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

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

我是新来WPF和MVVM模式,所以请原谅这个问题的基本性质。我花了一些时间阅读模式的背景,看了一些示例应用程序等,但我无法找到足够具体的东西让我对自己的答案充满信心。我也意识到MVVM对于一个应用程序来说可能过于简单,但我将它部分用作学习练习。

回答

1

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

我相信是的。模型应该隐藏逻辑FOR THE LOOK的外观,但它不能像逻辑结构那样隐藏Thign。

2.树控件中的选定项目应如何适应详细信息窗格的右侧 ViewModel类型? 一种选择似乎是在 MainWindowViewModel跟踪 所选的项目,树并执行 适应,露出它作为其他 属性,但我不知道是否有 一个更好的解决方案。

恕我直言,不是。

+0

希望得到一些答案的答案以确认答案......但看起来没有任何答案即将出现,所以我会接受这个,因为这是我所做的。 – 2010-11-29 12:16:38

0

对类似问题的工作我得出的结论是

object Tag { get; set; } 

属性是必然:(除非是一些罕见的情况下(在整个树状只有1种类型的对象)。

0

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

如果你真的,真的很在意这一点,你可以建立一个公开两个不同性质的高阶视图模型类 - TreeViewModel类型之一,DetailsViewModel类型之一。然后,主窗口的视图模型将同一对象暴露给树控件和细节控件,但是两个视图类型的逻辑结构将彼此解耦。

从逻辑上说,树控件中的选定项目和细节控件中出现的项目是相同的东西。虽然细节控制不会提供有关事物父/子关系的信息,但树控件不会显示有关事物名称/值对的信息,但它仍然是同样的事情。可能没有必要太担心表示事物的单个对象暴露了只有该事物的一个视图使用的属性。

相关问题