gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:02:09 24 4
gpt4 key购买 nike

假设我有一个模型,它公开了我将在 GUI 中显示和更改的对象集合。

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

View 绑定(bind)到 ViewModel,该 ViewModel 公开 ViewModelItem 的 ObservableCollection。 ViewModelItem 是 ModelItem 的 Viewmodel

View 包含一个 ListBox 和一个 DataTemplate。 DataTemplate 用于 ViewModelItem 类型的项目。 View DataContext 指向 ViewModel 的一个实例。 ListBox 绑定(bind)到 ObservableCollection。

我控制所有代码。

到目前为止这么简单。问题:

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

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

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

谢谢

最佳答案

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

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

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

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

将这一理念更进一步,ObservableCollectionSystem.Collections.ObjectModel -- 也不是特定于 View 的 -- 它实现了 System.Collections.Specialized.INotifyCollectionChanged这也不是特定于 View 的。换句话说,ObservableCollection被设计成一个通知其观察者变化的集合。如果您有需要这样做的模型,那么 ObservableCollection是你的工具。 WPF 和 Silverlight 使用这些接口(interface)进行数据绑定(bind)只是很方便(但并非偶然)。

我想这是一种冗长的说法:“是的。当你需要通知更改时,请在模型上使用通知接口(interface)。不要担心用这个混淆你的代码。要务实。”

关于wpf - MVVM:更改通知是否混淆了模型和 View 模型之间的分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4594094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com