快速观察可观察的收藏品。我一直在玩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中发生一些事情,但没有任何改变。
非常感谢任何帮助。
大卫
答案 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
事件中执行此操作。当儿童从收集中移除时,不要忘记解开事件。