【问题标题】:Ways to model child view model interaction with the parent view model?建模子视图模型与父视图模型交互的方法?
【发布时间】:2011-09-26 12:45:13
【问题描述】:

考虑某种带有 PimDetailVm 的个人信息管理演示,它将 Person 对象作为其模型。演示文稿将管理有关一个人的各个方面(姓名、联系点、地址等),这些方面一起会使原始视图模型膨胀。

所以我想为每个分离卫星视图模型。原始视图模型仍然负责允许和提交更新,因此它至少需要知道 IsDirty 和 IsValid 是否为真,以及模型的当前状态。

干杯,
浆果

更新

我的原始帖子中有(曾经)过多的文字;也许更好地组织这个会得到更多的回应并留下一些有用的东西,所以

父/子同步选项

  1. INPC
    • 优点 - 已由 VM 实现
    • 缺点 - 多次触发,可以说应该仅限于 DataBinding
  2. 调解员
    • 优点 - 清晰的意图分离
    • 缺点 - 不确定如何以通用方式实现和使用
  3. 事件聚合器
    • 优点 - 通用抽象
    • 缺点 - 不确定如何以通用方式实现和使用
  4. 域事件(即PersonUpdated)并让模型成为同步源
    • 优点 - 可以说该事件属于这里,简化了 VM 基础架构
    • 缺点 - 不确定
  5. 内部视图模型事件(即 ViewModelUpdated)
    • 优点 - 比 INPC 更清洁,因为它只发射一个并且其意图很明确
    • 缺点 - 不确定
  6. 硬链接(即,Parent.Update())
    • 优点 - 意图明确,更易于调试
    • 缺点 - 紧耦合
  7. 从依赖对象继承
    • 优点 - Will 喜欢它
    • 缺点 - 不可重用,与 WPF 调度程序紧密耦合
  8. 从 DynamicObject 继承 VM
    • 优点 - 你可以做你想做的事
    • 缺点 - 更改 ViewModel 结构,对没有经验的程序员来说很复杂
  9. 将 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


【解决方案1】:

为了解决这个问题,Pete Brown 谈到了这个here 的某些方面。

Josh Smith 在 hi MVVM Foundation library 中还有两个非常有用的类来解决这个问题:Messenger 和 PropertyObserver。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多