mvvm - WPF MVVM 模型的 DependencyProperty 类似物

标签 mvvm

我有我的 MVVM,模型由许多相关的类组成,但为了这个问题,我们只关注四个。

GrandParentModel、ParentModel、ChildModel 和联系人。

这些都继承自 ModelBase,它有一个 INotifyPropertyChanged 的​​实现。

所以这三个模型中的每一个都有一个 Contact 属性。如果 Child 没有属性,则应该查找 Parent,如果 Parent 为空,则查找 GrandParent。如果祖 parent 级别的联系人发生变化,我希望任何受抚养人,即任何子 parent 及其子女也为他们的联系人提出 PropertyChanged 事件。

我认为我要做的所有事情都将得到 DependencyProperty 系统的支持,但我不想使用它,因为这是我的模型、关注点分离等等。所以我正在整理一个迷你实现,这一切都很好。

我的问题是以前有没有人走这条路,将来有什么我应该担心的吗?我的蜘蛛侠感觉刺痛,我不知道为什么。

谢谢
伊恩

编辑:这里的对象之间的关系是祖 parent 有任意数量的 parent 有任意数量的 child 。我当前的模型在每个模型上都有一个指向父对象的属性(在祖 parent 的情况下为 null),并且父/祖 parent 具有一组子对象。

最佳答案

我一直在这条路上,它并不漂亮。基本上你必须订阅 PropertyChanged ParentModel的事件来自您的ChildModel .如果您的 child 可以更换 parent ,您必须小心。那么当你从 child 的角度收到 parent 发生变化的通知时,你必须提出自己的PropertyChanged关于 child 的事件。它变得丑陋,因为您最终可能会挂起忘记清理的事件处理程序。

更好的方法是创建自己的模型特定模拟到 DependencyProperty .基本上在 ChildModel 的构造函数中您“声明”该属性 Contact属性(property)代表Contact对象 Parent为空时。你可以使用一个观察 PropertyChanged 的小助手类来做到这一点。 ParentModel 上的事件对象并让它执行 PropertyChanged在适当的时候发生在 child 身上。也让它注意Parent属性改变在 child 身上。

您可以使用 MVVM Light 消息总线。让祖 parent 和 parent 在他们的 Contact 时都发送消息属性变化。让 child 听那些信息。当它收到一条消息时,检查它是否匹配它自己的 parent 或祖 parent ,并提出 PropertyChanged必要时事件。这比上述任何一种方法都好,因为您不必跟踪 parent 或祖 parent 何时发生变化。你不太可能有错误。它还使用弱引用,因此它不会像事件处理程序那样持有对象。

现在我一直在做的是远离让我的模型对象实现 INotifyPropertyChanged .我介绍了一个Presenter我的模型和我的 ViewModel 之间的层。 Presenter实际上是从小的 ViewModel“小部件”(例如,一个小部件可能是 ChangeValue<T> 小部件)构造一个 ViewModel。我有一个规则引擎告诉 Presenter如何用给定模型的小部件组成 ViewModel。 Presenter处理所有用户输入(基本上对模型执行 lambda),但由于它知道用户操作刚刚发生,它知道模型中的某些内容可能已经改变。模型操作完成后,它将所有数据从模型复制到 View 模型。 ViewModel 检查传入的数据并引发 PropertyChanged如果字段实际更改,则事件。显然这是最复杂的方式,但它为您提供了一个非常干净的模型,并且 ViewModel 和 Presenter 都不包含任何模型(域/业务)逻辑。

关于mvvm - WPF MVVM 模型的 DependencyProperty 类似物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4668239/

相关文章:

c# - 如何分解 450 行代码的 View 模型

internet-explorer - SVG未在Firefox和IE中使用Kendo模板渲染

c# - 使用模型类的特定字段填充 DataGrid

c# - EF4.0 中的延迟加载正在卡住 UI

WPF 应用程序退出时清理

c# - 如何阻止创建多个 ViewModel

android - 在Kotlin和Android中以MVVM模式保持应用程序状态的正确方法

c# - 抽象 ViewModel 在被继承时是否被视为模型?

c# - 简单的 WPF + MVVM 绑定(bind)

c# - 将 WPF 应用程序转换为 MVVM 时必须知道的事情的一般 list