MVVM:更改通知是否混淆了模型和视图模型之间的分离?

Ian*_*Ian 5 wpf mvvm

假设我有一个模型,它公开一组对象,我将在 GUI 中显示和更改这些对象。

所以我们让 Model 暴露了 ModelItem 的集合。

View 绑定到一个 ViewModel,它公开 ViewModelItem 的 ObservableCollection。ViewModelItem 是 ModelItem 的 Viewmodel

视图包含一个列表框和一个数据模板。DataTemplate 用于 ViewModelItem 类型的项目。View DataContext 指向 ViewModel 的一个实例。ListBox 绑定到 ObservableCollection。

我控制所有代码。

到目前为止如此简单。题:

将模型上的集合公开为 ObservableCollection 是否可以接受?此外,在 Model 和 ModelItem 上实现 INotifyPropertyChanged 是否可以接受?

我担心的是我混淆了模型和视图模型之间的分离,但是常识说,这是一种通知模型中元素更改的机制,让我们使用它......

只是想从别人那里得到一些看法。

谢谢

Bri*_*sio 5

简短的回答: 是的。当您需要通知更改时,请在模型上使用通知界面。不要担心用这个混淆你的代码。务实。

长答案: 我的哲学是这样的:在实现 MVVM 时,当没有额外的事情要做时直接绑定到模型对象。当您需要一些新东西(新行为、视图将使用的属性等)时,您可以将模型对象包装在 ViewModel 对象中。除了从模型委托数据之外什么都不做的 ViewModel 只不过是额外的代码。当您需要对模型对象提供给您的数据之外的数据执行某些操作时,您就引入了该层。

因此,为了进一步扩展我的想法(并更直接地回答您的问题),需要有一种方法让模型在发生变化时告诉 ViewModel。通常,模型数据是不可变的,因此不需要此通知机制,因此没有必要。但是,模型确实发生变化的情况也经常发生。发生这种情况时,模型有两个选项:使用自定义通知方法(事件、委托等)或使用INotifyPropertyChanged.

如果您查看 的命名空间INotifyPropertyChanged,它在System.ComponentModel——而不是视图——所以我更喜欢在模型中使用它。它是一个众所周知的接口,您可以使用它从您的视图中直接绑定到您的模型。无需实施任何不同的东西。

将这一理念更进一步,ObservableCollection是在System.Collections.ObjectModel——也不是特定于视图的——并且它实现System.Collections.Specialized.INotifyCollectionChanged了也不是特定于视图的。换句话说,ObservableCollection被设计为一个集合,通知它的观察者发生变化。如果您有一个需要这样做的模型,那么这ObservableCollection就是您的工具。WPF 和 Silverlight 使用这些接口进行数据绑定恰好很方便(不过并非偶然)。

我想这是一种冗长的说法:“是的。当您需要通知更改时,请在您的模型上使用您的通知界面。不要担心用它来混淆您的代码。务实。”