【问题标题】:Observable Collections Collection Changed可观察集合 集合已更改
【发布时间】:2011-11-30 20:34:49
【问题描述】:

对可观察的集合非常快速。我一直在 Silverlight 中玩这些东西,做一些绑定的东西,你有什么。从集合中删除或添加到集合时,似乎会触发 CollectionChanged 事件。当我更改集合内的一个类的属性时,我想要触发一些东西。集合属性本身已经具有 RaisePropertyChanged。我需要对类型类本身做一些特别的事情吗?所以如果我有这个:

ObservabelCollection<Person> personcollection... and if I change a property like:

Person p = personcollection.where(e => e.FirstName == "Joey").FirstOrDefault();
if (p != null) { p.FirstName = "Joe"; }

我希望 UI 中会发生一些事情,但没有任何变化。

任何帮助将不胜感激。

大卫

【问题讨论】:

    标签: .net silverlight observablecollection


    【解决方案1】:

    我知道你在做什么,但如果我正确的话 Observable Collection 只会在它的集合中的项目发生变化时引发INotifyCollectionChanged 事件。这将触发 UI 中的更改。

    它并不关心它的集合中某个对象的属性是否发生变化。您需要在这些对象的属性上实现INotifyPropertyChanged 接口以触发对 UI 的更改。

    我读过here,它给了我一些有用的见解。虽然它是针对 WPF 的,但其中大部分仍然适用,因为 Silverlight 本质上是 WPF 的一个子集。

    以及这篇MSDN 的文章指出:

     In particular, if you are using OneWay or TwoWay (for example, 
     you want your UI to update when the source properties change dynamically), 
     you must implement a suitable property changed notification mechanism 
     such as the INotifyPropertyChanged interface.
    

    【讨论】:

    • 感谢您的链接。我会再看看这个。
    【解决方案2】:

    要获取Person 类的更新,您应该为它们实现INotifyPropertyChanged

    【讨论】:

    • 是的,我知道这存在,但我正在使用这个 ViewModelBase 类中的“RaisePropertyChange”。我将不得不多玩一点。感谢您的洞察力。
    • @DavidWhitten 和 Person 类派生自 ViewModelBase?
    • INotifyPropertyChanged 就像一个魅力。我定了。非常感谢
    【解决方案3】:

    INotifyCollectionChanged 应该在集合更改时通知某人。

    INotifyPropertyChanged 应该在对象的属性发生更改时通知某人。

    类的对象必须实现接口并且必须正确触发事件。所以如果你通过 Binding 对象绑定它,UI 可以自行更新。

    ObservableCollection 正确实现了 INotifyCollectionChanged,但它与它包含的对象无关。因为如果一个对象的属性改变了那不是一个 CollectionChanged 事件。这是集合中具体对象的 PropertyChanged 事件。所以你必须在你的 Person 类中实现 INotifyPropertyChanged 接口。

    【讨论】:

      【解决方案4】:

      ObservableCollection 不报告对集合中对象的属性所做的更改。

      要获得这种行为,您必须在将每个子对象插入您的集合时为其挂钩 INotifyPropertyChanged.PropertyChanged 事件。您可以在集合的 CollectionChanged 事件中执行此操作。当孩子从集合中移除时,不要忘记取消挂钩事件。

      【讨论】: