繁体   English   中英

WPF MVVM:INPC和中介视图模型和模型之间的通信

[英]WPF MVVM: INPC and mediating communication between view model & model

我已经阅读了将模型数据中的更改传递给视图模型的各种方法。 有人建议模型应尽可能实现INotifyPropertyChanged,以便它可以通知视图模型已更改的属性。 一些建议在模型和视图模型之间建立服务层,服务层实现INPC,方法调用通过此服务层路由到模型,以便服务层通知视图模型。

我认为后者是对前者的更细粒度的修订,并且已经开始在我的模型类中实现INPC。 这感觉不对,因为

a)我现在必须在视图模型中编写一个事件处理程序,用于模型中的通知。 这采用长开关(propertyName)的形式,它在视图模型上设置相应的属性,导致NPC再次向上发送。 我觉得我在这里写了很多锅炉板代码。

b)视图模型现在通过一串字符串耦合到我的模型,这些字符串仅由约定规定,即没有定义“接口”。 更不用说这会导致IDE的困难。

c)我的模型必须进行修改以适应这种情况! 如果由于某种原因被关闭怎么办? 我认为这样的模式旨在增加代码的可重用性和关注点的分离。 不仅如此,而且触发INPC事件所需的代码是繁琐且重复的,并且不是真正可抽象的。

我真的很想知道WPF专业人员如何通过依赖属性等来解决这个问题。我感觉我错过了一些东西。 我并不热衷于使用一个框架,因为我想从头开始学习。 我已经离开WPF一两年了,最近和AngularJS一起工作让我质疑我的方法。

谢谢!

出于本答案的目的,我将调用业务对象类的“数据类型”。

根据我的个人经验,视图模型始终与数据类型相关联。 您必须具有要显示的类型的属性,因此始终会存在从视图模型命名空间到数据类型命名空间的引用。

您所谓的模型(根据您的评论中的描述)听起来像我的视图模型。 我的视图模型具有属性,主要是各种数据类型类和方法的类型,而我的数据类型类只占用大部分属性......它们只是数据的持有者和变更的记者。

您似乎认为INotifyPropertyChanged接口在您调用它时的'model'和视图模型类之间执行某些任务...在我看来,这在MSDN的INotifyPropertyChanged接口页面中是可选的... :

INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。

因此,我将INotifyPropertyChanged接口视为视图与视图模型和数据对象之间的“生命之血”。 一些开发人员更喜欢在自己的视图模型中“包装”每种数据类型,但我更喜欢直接在我的数据类型中实现INotifyPropertyChanged接口。

我这样做的主要原因是我可以在我拥有的自定义集合类中挂钩这个框架。 这使我能够拥有知道对集合中任何项目中的任何属性所做的任何更改的集合。 它还使我能够在我的基类中构建数据同步,以便对象知道它们何时有任何更改。

它还节省了为每个数据类型类创建匹配的视图模型类的时间。 为什么有两个班级可以做什么? 我从来不需要那种程度的分离。 如果我理解正确,在数据类型类中实现此接口将无需执行您的观点a)。

你的一些点b)和c)也可以被视为无效,如果你可以使用.NET 4.5的有一个新的CallerMemberNameAttribute ,你可以用它来自动进给每个属性的名称属性PropertyChanged处理程序。 我找到了一篇很好的文章,名为C#5-Making INotifyPropertyChanged ,对它有一个很好的描述。

我现在已经编写了几个大规模的WPF应用程序和一些框架,我在数据类型类中实现INotifyPropertyChanged接口时从未遇到过问题。 事实上,如果我必须为每个数据类型类实现包装器视图模型类,我认为我不能在同一时间编写它们。 到目前为止,这种方法对我很有用,我打算坚持下去,直到我找到一个更好的方法。 然而,这只是一个开发人员的意见,你必须采取适合你的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM