【发布时间】:2011-09-26 12:45:13
【问题描述】:
考虑某种带有 PimDetailVm 的个人信息管理演示,它将 Person 对象作为其模型。演示文稿将管理有关一个人的各个方面(姓名、联系点、地址等),这些方面一起会使原始视图模型膨胀。
所以我想为每个分离卫星视图模型。原始视图模型仍然负责允许和提交更新,因此它至少需要知道 IsDirty 和 IsValid 是否为真,以及模型的当前状态。
干杯,
浆果
更新
我的原始帖子中有(曾经)过多的文字;也许更好地组织这个会得到更多的回应并留下一些有用的东西,所以
父/子同步选项
- INPC
- 优点 - 已由 VM 实现
- 缺点 - 多次触发,可以说应该仅限于 DataBinding
- 调解员
- 优点 - 清晰的意图分离
- 缺点 - 不确定如何以通用方式实现和使用
- 事件聚合器
- 优点 - 通用抽象
- 缺点 - 不确定如何以通用方式实现和使用
- 域事件(即PersonUpdated)并让模型成为同步源
- 优点 - 可以说该事件属于这里,简化了 VM 基础架构
- 缺点 - 不确定
- 内部视图模型事件(即 ViewModelUpdated)
- 优点 - 比 INPC 更清洁,因为它只发射一个并且其意图很明确
- 缺点 - 不确定
- 硬链接(即,Parent.Update())
- 优点 - 意图明确,更易于调试
- 缺点 - 紧耦合
- 从依赖对象继承
- 优点 - Will 喜欢它
- 缺点 - 不可重用,与 WPF 调度程序紧密耦合
- 从 DynamicObject 继承 VM
- 优点 - 你可以做你想做的事
- 缺点 - 更改 ViewModel 结构,对没有经验的程序员来说很复杂
- 将 AOP 与拦截器结合起来
- 优点 - 做你想做的事
- 缺点 - 学习曲线,不明显
【问题讨论】:
-
我通常只是让我的 ViewModel 扩展 DO 并将它们组合到 xaml--
<this:ParentViewModel x:Name="Parent" Child="{StaticResource Child}" />但有些人讨厌这样。就像我讨厌带标签的问题标题一样。燃烧的仇恨将核心掏空,只留下焦黑的煤渣。 -
好吧,如果它有助于让你的性格更阳光,我更喜欢你的标题。 “如何组合视图模型关系”可能也很有效!您是否有一些代码或链接可以更好地展示您的方法?为什么仇恨者如此讨厌它?
-
老实说,没有任何特殊代码。您只需扩展 DependencyObject 并像对待任何其他 DO 一样对待您的 ViewModel。在 App.xaml 中将它们创建为资源(StaticResource 可以在任何地方找到它们)。你可以使用 StaticResource 标记扩展来分配它们,你可以将它们相互绑定,等等。有些人讨厌它,因为他们认为 ViewModel 应该与实现无关。但是谁曾经在两个不同的平台上使用过相同的 ViewModel 类型呢?这种代码重用是不存在的。在 xaml 中像对待其他所有内容一样对待它们非常容易。
标签: events design-patterns mvvm