WPF-MVVM:INPC与视图模型&;模型
本文关键字:模型 amp 视图 INPC WPF-MVVM | 更新日期: 2023-09-27 18:29:17
我已经阅读了将模型数据中的更改传达给视图模型的各种方法。有些人建议模型应该尽可能实现INotifyPropertyChanged,这样它就可以将更改的属性通知视图模型。一些人建议在模型和视图模型之间建立一个服务层,由服务层实现INPC,方法调用通过该服务层路由到模型,以便服务层通知视图模型。
我认为后者是对前者的更精细的修订,并已开始在我的模型类中实现INPC。感觉不对,因为
a) 现在,我必须在视图模型中为来自该模型的通知编写一个事件处理程序。这采用了一个长开关(propertyName)的形式,它在视图模型上设置相应的属性,导致NPC再次向上发送。我觉得我在这里写了很多锅炉板代码。
b) 视图模型现在通过一组字符串耦合到我的模型,这些字符串仅受约定的约束,即没有定义"接口"。更不用说这给IDE带来的困难了。
c) 我的模型必须修改以适应这种情况!如果它因为某种原因关闭了呢?我认为像这样的模式是为了增加代码的可重用性;关注点分离。不仅如此,激发INPC事件所需的代码也是乏味和重复的,并且不是真正抽象的。
我真的很想知道WPF专业人员是如何处理这个问题的,无论是通过依赖属性等。我觉得我错过了一些东西。我不喜欢使用框架,因为我想"从头开始"学习。我已经离开WPF一两年了,最近与AngularJS的合作让我对我在这里的方法产生了疑问。
谢谢!
出于这个答案的目的,我将把业务对象类称为"数据类型"。
根据我的个人经验,视图模型总是与数据类型绑定在一起。您必须具有要显示的类型的属性,因此始终存在从视图模型命名空间到数据类型命名空间的引用。
你所说的模型(根据你评论中的描述)听起来像我的视图模型。我的视图模型有属性,主要是各种数据类型类和方法的类型,而我的数据类型类在很大程度上只包含属性。。。他们实际上只是数据的持有者和变化的报告者。
您似乎认为INotifyPropertyChanged
接口在您所称的"模型"和视图模型类之间执行一些职责。。。在我看来,这充其量是可选的。。。来自MSDN上的INotifyPropertyChanged Interface页面:
INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。
因此,我认为INotifyPropertyChanged
接口是视图与视图模型和数据对象之间的"生命之血"。有些开发人员更喜欢将每个数据类型"包装"在自己的视图模型中,但我更喜欢直接在数据类型中实现INotifyPropertyChanged
接口。
我这样做的主要原因是,我可以在我拥有的自定义集合类中钩住这个框架。这使我的集合能够了解对集合中任何项的任何属性所做的任何更改以及其他内容。它还使我能够在基类中构建数据同步,这样对象就可以知道它们何时有任何更改。
它还节省了为每个数据类型类创建匹配的视图模型类的时间。为什么有两个班要做一个班能做的事?我从来都不需要那种程度的分离。如果我理解正确的话,在数据类型类中实现这个接口将消除执行a)点的需要。
如果可以使用.NET 4.5,则某些点b)和c)也可能会被视为无效,因为有一个新的CallerMemberNameAttribute
属性可以用来自动将每个属性的名称提供给PropertyChanged
处理程序。我发现了一篇很好的文章,名为C#5——让INotifyPropertyChanged更容易,并对其进行了很好的描述
我现在已经编写了几个大规模的WPF应用程序和一些框架,在我的数据类型类中实现INotifyPropertyChanged
接口从来没有遇到过问题。事实上,如果必须为每个数据类型类实现包装器视图模型类,我不认为我可以同时编写它们。到目前为止,这种方法对我很有用,我计划坚持下去,至少在找到更好的方法之前。然而,这只是一个开发人员的意见,你必须选择对你来说合适的。