Mvvm 为什么模型中的ObservableCollection和InotifyProperty发生了更改?

Mvvm 为什么模型中的ObservableCollection和InotifyProperty发生了更改?,mvvm,Mvvm,我已经读到,MVVM中的模型实现诸如ObservableCollection、INotifyPropertyChanged和IDataError等接口是很常见的 我的问题是为什么在模型级别而不是ViewModel级别执行此操作。我希望“纯”模型没有任何通知逻辑,只有数据和业务逻辑。我的第一印象是VM将包装模型的属性并处理通知 我承认在模型中实现这些接口在很多情况下可能会使实现更容易,但我想解释一下为什么模型应该负责通知 INPC是核心框架的一部分,不同于专门属于WPF的ICommand和Depe

我已经读到,MVVM中的模型实现诸如
ObservableCollection
INotifyPropertyChanged
IDataError
等接口是很常见的

我的问题是为什么在模型级别而不是ViewModel级别执行此操作。我希望“纯”模型没有任何通知逻辑,只有数据和业务逻辑。我的第一印象是VM将包装模型的属性并处理通知


我承认在模型中实现这些接口在很多情况下可能会使实现更容易,但我想解释一下为什么模型应该负责通知

INPC是核心框架的一部分,不同于专门属于WPF的ICommand和DependencyObject。关于从服务层公开IQueryable,也有类似的问题。与INPC一样,IQueryable是一个核心框架类。不使用它们中的任何一个来创建一个纯模型都是过分的

更糟糕的是,它会导致重复(使VM包装公开属性只是为了添加propertychanged通知)


另一方面,可观察的集合是另一种野兽。域模型中的集合通常表示实体关系。在许多情况下,您无法控制它们的实例化。根据您的应用程序,您可能有相同数据的多个视图和ViewModels,这需要进行权衡。假设您有一个窗口显示具有只读详细信息的项目列表,但在另一个窗口中,您可以添加、编辑和删除项目

如果模型使用了
ObservableCollection
INotifyPropertyChanged
,则在可编辑视图/视图模型中所做的更改将在不可编辑视图/视图模型中查看和更新

此外,如果不可编辑视图足够简单,则可以直接公开并绑定到模型,这也是可以接受的。由于没有ViewModel来处理通知,因此模型需要自己完成工作