gpt4 book ai didi

wpf - MVVM:设计具有聚合/依赖 ViewModel 的 ViewModel 架构

转载 作者:行者123 更新时间:2023-12-03 10:30:40 25 4
gpt4 key购买 nike

WPF/MVVM Alpha 极客 说:

1 个 View 有 1 个 View 模型。有时,多个 View 有 1 个 ViewModel(使用向导)。

如果您考虑我的图像,您会看到 6 个彩色 View /用户控件。

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

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

问题:

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

2. 假设这些是 6 个用户控件,它们应该共享相同的 ViewModel 吗?
或者每个 View 应该有自己的 View 模型?

一种。)
在绿色中创建类代码
将类(class)代码发送给 YELLOW

乙)
选择黄色的类(class)代码
将当前瞳孔更改为蓝色

C。)
选择蓝色的当前学生
在 RED 中更改学生详细信息
更改 ORANGE 中的学生文档

D.)
用 PINK 创建学生
送学生到BLUE

E.)... 更多

这是要走的路吗,使用 Messenger 类围绕数据来保持关系最新?

对我来说有一个重大缺陷:

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

SchoolclassCodeViewModel 1:N PupilViewModel。

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

alt text

最佳答案

Dan 的方法与我要建议的方法几乎相同。要回答具体问题:

1)如果他们的布局有任何复杂性,我会让他们成为用户控件。一方面,始终如一地做所有事情更容易;另一方面,这使得在 Expression Blend 中使用该控件的布局变得更容易,而无需实例化整个窗口。

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

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

2A) ClassCodeViewModel暴露了 CreateCommand在执行时引发事件。窗口 View 模型处理此事件并对 ClassCodes 进行适当的更新。当它被提升时。

2B)类代码 View 模型包含瞳孔 View 模型的可观察集合。 SelectedItem SelectedClassCode 中的属性(property) SelectedItem 的窗口 View 模型中的属性关于类代码 View 模型是必然的。蓝 View 绑定(bind) SelectedClassCode.Pupils .

2C) 同样,窗口 View 模型包含 SelectedPupil SelectedItem 的属性蓝色 View 的属性是绑定(bind)的。红色 View 绑定(bind) SelectedPupil .

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

3) 瞳孔 View 模型包含一个 bool 值 CanCreate属性(property)。这在红色 View 中没有使用。窗口 View 模型集 NewPupil.CanCreateSelectedClassCode 的 setter 中.

你没有问,但橙色 View 绑定(bind)到 Documents SelectedPupil 的属性(property),这可能(取决于实际的文档)是 DocumentViewModel 的可观察集合对象。

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

关于wpf - MVVM:设计具有聚合/依赖 ViewModel 的 ViewModel 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com