可观察的集合集合已更改

时间:2011-11-30 20:34:49

标签: .net silverlight observablecollection

快速观察可观察的收藏品。我一直在玩Silverlight中的这些东西做一些有约束力的东西,你有什么。看起来像CollectionChanged事件在从集合中删除或添加时会触发。当我在集合中的一个类上更改属性时,我想要触发一些东西。 collection属性本身已经有了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中发生一些事情,但没有任何改变。

非常感谢任何帮助。

大卫

4 个答案:

答案 0 :(得分:2)

要获取Person课程的更新,您应该为他们实施INotifyPropertyChanged

答案 1 :(得分:2)

我看到你正在尝试做什么但是如果我正确的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 :(得分:0)

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

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

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

ObservableCollection 正确实现 INotifyCollectionChanged ,但它与其包含的对象无关。因为如果对象的属性更改而不是CollectionChanged事件。这是集合中具体对象的 PropertyChanged事件。因此,您必须在Person类中实现 INotifyPropertyChanged 接口。

答案 3 :(得分:0)

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

要获得该行为,您必须在每个子对象插入集合时挂钩INotifyPropertyChanged.PropertyChanged事件。您可以在集合的CollectionChanged事件中执行此操作。当儿童从收集中移除时,不要忘记解开事件。