MVVM:使用聚合/依赖ViewModel设计ViewModel体系结构

时间:2010-11-19 21:56:06

标签: wpf mvvm communication viewmodel mediator

WPF / MVVM alpha极客说:

1 View有1个ViewModel。有时多个视图有1个ViewModel(使用向导)。

如果你看我的图像,你会看到6个彩色的视图/用户控件。

YELLOW,GREEN和ORANGE UserControls 在我的应用程序中多次使用。

粉色,蓝色和红色UserControl仅使用一次。

问题:

1。我应该将它们作为UserControls吗?如果是的话,为什么我不重复使用它们。

2. 假设这些是6个UserControl,它们是否应该共享相同的ViewModel? 或者每个View都有自己的ViewModel?

一个。) 用绿色创建类代码 将课程代码发送给YELLOW

B中。) 在黄色中选择类代码 改变蓝色当前瞳孔

下进行。) 选择BLUE中的当前瞳孔 用红色改变学生的细节 在ORANGE中更改学生文档

d)。 在PINK中创建学生 将学生送到蓝色

E。)......还有更多

这是一种方法,使用Messenger类触发数据以使关系保持最新状态吗?

我有一个重大缺陷:

我创建了一个PupilViewModel,但我不知道在NewPupilViewModel(PINK)中,在YELLOW UserControl中存在一个SchoolclassCodeViewModel,所以我可以将我的新PupilViewModel添加到BLUE UserControl。

SchoolclassCodeViewModel 1:N PupilViewModel。

3. 你会如何解决这个问题?

alt text

1 个答案:

答案 0 :(得分:3)

丹的方法与我的建议非常相似。回答具体问题:

1)如果他们的布局有任何复杂性,我会把它们变成UserControls。首先,它更容易做到一切;另一方面,这样可以更容易地在Expression Blend中使用该控件的布局,而无需实例化整个窗口。

2)整个窗口都有应用程序视图模型。它包含需要它们的视图的属性:

ObservableCollection<ClassCodeViewModel> ClassCodes
ClassCodeViewModel NewClassCode
ClassCodeViewModel SelectedClassCode
PupilViewModel NewPupil
PupilViewModel SelectedPupil

2A)ClassCodeViewModel公开了一个CreateCommand,它在执行时引发了一个事件。窗口视图模型处理此事件,并在ClassCodes引发时对其进行适当的更新。

2B)类代码视图模型包含一个可观察的瞳孔视图模型集合。窗口视图模型中SelectedItem属性中的SelectedClassCode属性绑定了类代码视图模型上的SelectedItem。蓝色视图绑定到SelectedClassCode.Pupils

2C)同样,窗口视图模型包含一个SelectedPupil属性,蓝色视图的SelectedItem属性绑定到该属性。红色视图绑定到SelectedPupil

2D)这与在2A中处理的方式相同:瞳孔视图模型引发一个事件,窗口视图模型处理它。

3)pupil视图模型包含布尔CanCreate属性。红色视图中不使用此选项。窗口视图模型在NewPupil.CanCreate

的设置器中设置SelectedClassCode

您没有问,但橙色视图绑定到Documents的{​​{1}}属性,这可能(取决于实际上是什么文档)SelectedPupil的可观察集合对象。

也许我已经在MVVM领域工作太久了,但这对我来说似乎非常简单。