我已经阅读了将模型数据中的更改传达给 View 模型的各种方法。 有些人建议模型应该尽可能实现 INotifyPropertyChanged,以便它可以通知 View 模型更改的属性。有些人建议在模型和 View 模型之间建立一个服务层,服务层实现 INPC,方法调用通过该服务层路由到模型,以便服务层通知 View 模型。
我认为后者是前者的更精细的修订版,并已开始在我的模型类中实现 INPC。感觉不对是因为
a) 我现在必须在我的 View 模型中编写一个事件处理程序来接收来自模型的通知。 这采用长开关(propertyName)的形式,它在 View 模型上设置相应的属性,导致 NPC 再次向上发送。我觉得我在这里写了很多样板代码。
b) View 模型现在通过一堆字符串耦合到我的模型,这些字符串仅由约定规定,即没有定义“接口(interface)”。更不用说这给 IDE 带来的困难了。
c) 我的模型必须修改以适应这种情况!如果由于某种原因关闭了怎么办?我认为这样的模式旨在提高代码的可重用性和关注点分离。不仅如此,触发 INPC 事件所需的代码也是乏味和重复的,并且不是真正可抽象的。
我真的很想知道 WPF 专业人员是如何通过依赖属性等来解决这个问题的。我觉得我遗漏了一些东西。我不喜欢使用框架,因为我想“从头开始”学习。 我已经离开 WPF 一两年了,最近使用 AngularJS 让我质疑我的方法。
谢谢!
最佳答案
For the purpose of this answer, I will call the business object classes 'data types'.
根据我个人的经验, View 模型总是与数据类型相关联。您必须具有要显示的类型的属性,因此始终存在从 View 模型命名空间到数据类型命名空间的引用。
你所说的模型(根据你在评论中的描述)听起来像我的 View 模型。我的 View 模型具有属性,主要是各种数据类型类和方法的类型,而我的数据类型类大部分只包含属性……它们只是数据的持有者和变化的报告者。
您的印象似乎是 INotifyPropertyChanged
接口(interface)在您称之为“模型”和 View 模型类之间执行一些职责...在我看来,这充其量是可选的... 来自 INotifyPropertyChanged Interface MSDN 页面:
The INotifyPropertyChanged interface is used to notify clients, typically binding clients, that a property value has changed.
因此,我将 INotifyPropertyChanged
接口(interface)视为 View 与 View 模型和数据对象之间的“生命线”。一些开发人员更喜欢将每种数据类型“包装”在其自己的 View 模型中,但我更喜欢直接在我的数据类型中实现 INotifyPropertyChanged
接口(interface)。
我这样做的主要原因是我可以在我拥有的自定义集合类中连接到这个框架。这使我能够拥有了解对集合中任何项目的任何属性所做的任何更改的集合。它还使我能够将数据同步构建到我的基类中,以便对象知道它们何时发生任何更改。
它还节省了为每个数据类型类创建匹配的 View 模型类的时间。为什么有两个类(class)做一个类(class)可以做的事情?我从来不需要那种程度的分离。如果我理解正确的话,在你的数据类型类中实现这个接口(interface)将不需要执行你的点 a)。
如果您可以使用 .NET 4.5,您的一些观点 b) 和 c) 可能也无效,因为有一个新的 CallerMemberNameAttribute
您可以使用该属性自动将每个属性的名称提供给 PropertyChanged
处理程序。我找到了一篇名为 C# 5–Making INotifyPropertyChanged Easier 的好文章对此有很好的描述。
我现在已经编写了几个大型 WPF 应用程序和一些框架,并且在我的数据类型类中实现 INotifyPropertyChanged
接口(interface)时从未遇到过问题。事实上,如果我必须为每个数据类型类实现包装 View 模型类,我不认为我可以同时编写它们。到目前为止,这种方法对我很有用,我打算坚持使用它,至少在找到更好的方法之前。然而,这只是一个开发人员的意见,您必须选择适合您的方式。
关于c# - WPF MVVM : INPC and mediating communication between view model & model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18492559/