WPF MVVM模型的依赖性性质模拟

WPF MVVM模型的依赖性性质模拟,mvvm,Mvvm,我有我的MVVM,这个模型由许多相关的类组成,但是为了这个问题,我们将只关注四个 祖父母模型、父母模型、子女模型和联系人 这些都是从ModelBase继承的,ModelBase上有一个INotifyPropertyChanged的实现 因此,这三个模型中的每一个都具有接触特性。若孩子并没有财产,那个么它应该向父母求助,若父母为空,那个么它将向祖父母求助。如果祖父母级别的联系人发生变化,我希望任何受抚养人(即任何子父母及其子女)也为他们的联系人举办一次财产变更活动 我想我要做的一切都会得到Depe

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

祖父母模型、父母模型、子女模型和联系人

这些都是从ModelBase继承的,ModelBase上有一个INotifyPropertyChanged的实现

因此,这三个模型中的每一个都具有接触特性。若孩子并没有财产,那个么它应该向父母求助,若父母为空,那个么它将向祖父母求助。如果祖父母级别的联系人发生变化,我希望任何受抚养人(即任何子父母及其子女)也为他们的联系人举办一次财产变更活动

我想我要做的一切都会得到DependencyProperty系统的支持,但我不想使用它,因为这是我的模型,关注点分离等等。所以我准备了一个小型的实现,一切都很好

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

谢谢 伊恩


编辑:这里的对象之间的关系是祖父母有任意数量的父母有任意数量的孩子。我当前的模型在每个属性上都有一个指向父对象的属性(祖父母为空),父/祖父母有一个子对象集合。

我一直在走这条路,这并不漂亮。基本上,您必须从您的
ChildModel
订阅
ParentModel
PropertyChanged
事件。如果你的孩子能换父母,你必须小心。然后,当您从孩子的角度收到家长变更的通知时,您必须对孩子提出自己的
PropertyChanged
事件。它会变得丑陋,因为最终可能会挂起忘记清理的事件处理程序

更好的方法是创建自己的特定于模型的模拟,以
dependencProperty
。基本上,在
ChildModel
的构造函数中,当为空时,您“声明”属性
Contact
委托给对象
Parent
的属性
Contact
。您可以使用一个小助手类来完成这项工作,该类观察
ParentModel
对象上的
PropertyChanged
事件,并在适当的时候让它在子对象上执行
PropertyChanged
事件。还可以让它监视子对象上的
父对象
属性的变化

您可以使用MVVM轻型消息总线。当他们的
联系人
财产发生变化时,让祖父母和父母都发送一条消息。让孩子听那些信息。当它收到一条消息时,检查它是否匹配自己的父母或祖父母,必要时引发
PropertyChanged
事件。这比上述两种方法都好,因为你不必跟踪父母或祖父母的变化。你不太可能有虫子。它还使用弱引用,因此不会像事件处理程序那样保留对象


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

您能添加一个类层次结构/关系的示例吗?(最好使用伪代码)它们是“是a”还是“有a”关系?复杂属性还是集合?在本例中,我的ModelBase包含一个父属性,该属性在创建时设置为对象的父属性,如果我可以将代码长度降低到适合这里的长度,我将发布完整的解决方案。我在上面添加了一些编辑,老实说,结构不是固定不变的。很有趣。我确实整合了一个类似类的依赖属性,明天当我回到代码前面时,我将发布一个精简版本。我喜欢你的演讲者概念,我开始做一些类似的事情,所以很高兴听到你在说什么,这将帮助我,我想:)好的,多奇,我有一个解决方案,但我认为在这里发布时间太长了。如果允许的话,我会把一篇博文放在一起,并发布它的url。@Ian-我真的很想看看。请把它贴出来。给你:请记住这是我的初稿,所以有点零碎,但同时,一定要把它撕开,自由地评论,我总是很高兴学习。如果在博客方面有任何问题,请告诉我,这是我第一篇奇怪的博文:)对,我还发现WordPress也可以进行代码格式化,所以当我回家后,我会更新博文:)