代码之家  ›  专栏  ›  技术社区  ›  Elisabeth

MVVM:设计具有聚合/依赖视图模型的视图模型体系结构

  •  2
  • Elisabeth  · 技术社区  · 15 年前

    这个 WPF/MVVM阿尔法极客 说:

    一个视图有一个视图模型。有时多个视图有一个视图模型(使用 向导 ).

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

    黄色、绿色和橙色的用户控件 在我的应用程序中多次使用。

    粉色、蓝色和红色的用户控件只使用一次。

    问题:

    我应该让它们也成为用户控件吗?如果是,为什么我不重用它们。

    假设这是6个用户控件,它们是否应该共享同一个ViewModel? 或者每个视图都应该有自己的视图模型?

    A.) 用绿色创建类代码 将类代码发送到黄色

    B.) 选择黄色的类代码 用蓝色改变当前瞳孔

    C.) 选择当前蓝色瞳孔 更改红色瞳孔详细信息 把瞳孔文件换成橙色

    D.) 创建粉红色瞳孔 把学生送蓝

    E.)。。。更多

    这是一种方法吗?用一个信使类来发送数据以保持关系的最新状态?

    我有一个主要的缺点:

    我创建了一个PUPPIVIEW模型,但我不知道在NealPuppVIEW模型(Plue)中有一个ClaseClaskDeVIEW模型存在于黄色用户控件中,这样我就可以把我的新PuPiVIEW模型添加到蓝色用户控件中。

    学校类代码视图模型1:N实用视图模型。

    三。 你将如何解决这个问题?

    alt text

    1 回复  |  直到 15 年前
        1
  •  2
  •   Robert Rossney    15 年前

    丹的方法和我要建议的差不多。回答具体问题:

    1)如果他们的布局有任何复杂性,我会让他们成为UserControls。一方面,一致地做每件事更容易;另一方面,这使得在ExpressionBlend中处理控件的布局更容易,而不必实例化整个窗口。

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

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

    (第二章) ClassCodeViewModel 暴露 CreateCommand 执行时引发事件。窗口视图模型处理此事件并对 ClassCodes 当它升起的时候。

    2B)类代码视图模型包含可观察的瞳孔视图模型集合。这个 SelectedItem 中的属性 SelectedClassCode 窗口视图模型中的属性 选择项目 在类代码视图模型上绑定到。蓝色的景色注定 SelectedClassCode.Pupils .

    2C)同样,窗口视图模型包含 SelectedPupil 财产 选择项目 蓝色视图的属性绑定到。红色的景色注定 选择瞳孔 .

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

    3)瞳孔视图模型包含一个布尔值 CanCreate 财产。红色视图中不使用此选项。窗口视图模型集 NewPupil.CanCreate 选择类代码 .

    你没问,但是橙色的景色一定是 Documents 财产 选择瞳孔 ,这可能是(取决于实际文档是什么)可观察到的 DocumentViewModel 物体。

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