【问题标题】:How to implement INotifyPropertyChanged and observableCollection in MVVM pattern?如何在 MVVM 模式中实现 INotifyPropertyChanged 和 observableCollection?
【发布时间】:2011-04-06 17:44:58
【问题描述】:

我在模型中有一个产品的 ObservableCollection,我希望 ViewModel 监听产品的 ObservableCollection 中的任何变化。

我不确定如何去实施它。我已经阅读了几个教程,但其中大多数都不是 MVVM 特定的。

我应该在 ViewModel 类中实现 INotifyPropertyChanged,如何指定我要监听产品的 OberserableCollection?

谢谢:)

【问题讨论】:

    标签: silverlight mvvm


    【解决方案1】:

    我知道这个问题已经得到解答,但还有更多需要考虑。

    1) ViewModel 应该实现 INotifyPropertyChanged,这是使其成为 ViewModel 的原因之一。即使在它公开的唯一属性是 ObservableCollection 的不太可能的情况下,它也需要在实际的 ObservableColelction 属性更改时引发属性更改(在第 3 项中有更多内容)

    2) 您真的希望 ViewModel 或 View 监听这些变化吗?这是两个不同的东西。 ViewModel 应该持有一个 ObservableCollection,然后绑定到 View。你想要的是让视图对这些变化做出反应。在这种情况下,Brandon 是正确的,即 ObservableCollection 开箱即用地为您执行此操作。所以 View 有一个 ViewModel 的实例设置为 DataContext,并且 View 中的一些可视元素绑定到 ObservableCollection(如 ListBox 上的 ItemsSource)。

    3) 例外是 ViewModel 中的 ObservableCollection 属性本身。虽然 ObservableCollection 实现了 INotifyPropertyChanged,但它是集合对象的一部分:当 ViewModel 中的对象引用发生更改(如重新创建)时,ViewModel 仍需要报告 ObservableCollection 的属性已更改。

    只是一些想法。

    【讨论】:

    • 非常感谢,它们是非常有用的 cmets。 1. 我确实希望 ViewModel 能够监听 Model 中 OberservableCollections 的变化。 View 将 dataContext 设置为我的 ViewModel,并且文本框绑定到 ViewModel 中的 observableCollection,因此一旦 ViewModel 和 View 中的 observableCollection 绑定,View 应该会自动反映更改。 2. 感谢您指出这一点,我也必须实现 iNotifyProperty :) 但现阶段我并不担心它,我只想让事情顺利进行,并在此过程中进行修改。
    • 3.我对动作的实现不是很确定,也没有找到很多详细的教程,你有什么想法吗?再次感谢:)
    • 您的回复中令人困惑的部分是:1) ObservableCollection 应该属于您的 ViewModel,而不是 Model 本身。我会觉得很奇怪 Model 类使用 ObservableCollection。 2) 为什么你有一个 TextBox 绑定到一个集合? 3) 在 ViewModel 上实现 INotifyPropertyChanged 应该是您要做的第一件事,因此您已经“处于那个阶段”。大多数人把它放在 ViewModelBase 类中,所以他们总是拥有它。
    • 我目前没有任何东西,但我正在处理中。我给出了一个名为“实用 MVVM”的演示文稿,其中包含一个简单的实现。您可以在“practicalmvvm.com/Artifacts/PracticalMVVM.pptx”下载PPT,在“practicalmvvm.com/Artifacts/sample_no_source_control.zip”下载解决方案。如果您能看到演示文稿,它们会对您更有意义,但希望它会有所帮助。
    • 嗨,乔尔。感谢您的答复。 1.如果我在我的模型中使用不使用ObservableCollection,那么如果模型中有一些变化,我是否能够通知ViewModel? 2. 抱歉,我的意思是我的文本框绑定到 ViewModel 类中 ObservableCollection 的属性。 3. emm..我已经在 BaseViewModel 类中实现了 PropertyChanged,我只是不知道如何使用它......问题是我在网上找不到任何示例代码:(
    【解决方案2】:

    ObservableCollection 已经实现了 INotifyPropertyChanged,所以你不需要。

    【讨论】:

    • 好的,所以我必须明确告诉我的 ViewModel 来监听 Model 的变化吗?
    • 不,你只需要绑定到 ObservableCollection。当添加、删除项目或刷新收藏夹时,您的 UI 将收到通知。这是一篇很好的文章来解释它。 codeproject.com/KB/silverlight/SLListVsOCollections.aspx
    • 另外,请确保不要将 ObservableCollection 替换为另一个实例。如果您有理由清空整个集合并将其替换为其他内容,则需要 Clear() 集合,然后 Add() 或 AddRange() 将新项目添加到其中。如果替换实例,视图将失去其绑定。
    • @nlawalker:绑定本身仍然有效,但它指向的对象不再可用。那样说意味着必须再次对绑定进行编码,而它没有。相反,必须重新评估绑定,这就是您在集合 Property 上引发 PropertyChanged 的​​原因。始终使用 Clear 和 Add 可以正常工作,但并非绝对必要。
    • @BrandonZeider - 我同意这有点不合常规,当然不是我想要的。我只是想为以后可能会找到它的任何人添加信息。
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2015-09-29
    • 2017-06-20
    • 1970-01-01
    • 2011-07-14
    • 2011-10-18
    相关资源
    最近更新 更多