2009-12-20 21 views
7

ObservableCollection实施INotifyCollectionChangedINotifyPropertyChanged在ObservableCollection上实现INotifyPropertyChanged的目的是什么?

  • 我明白,添加, 缺失(+清晰),和项目的更换 通过收集的事件 CollectionChanged都通知到消费者 ,并且,在现有项目的更新 可 使用项目'事件 PropertyChanged监控,如果他们自己实施 自己INotifyPropertyChanged

  • 我从别人看,你不能对集合的事件 PropertyChanged 寄存器,因为它是 只读。

那么,什么是它的目的,我们可以做什么利用它

这里和那里的评论似乎让这个讨论感到困惑暗示ObservableCollection的神奇是实现两个接口,允许通知收集和项目内容的变化,虽然这是不正确的(这被忽略很多例子,其中集合绑定到一个列表框,在项目内容改变后神奇地更新,表明集合通知列表框)。

实际上它似乎收集的唯一优势是实施INotifyCollectionChanged。使用ObservableCollection处理项目属性更改似乎比其他集合更容易:只有当项目实现INotifyPropertyChanged时,才可能执行这些项目属性更改,而这些项目不可以这样做,并且用户设法独立于集合挂钩此事件。

这是正确的吗?

回答

1

只是猜测:所以可以通知对集合的Count属性所做的更改?

3

WPFs绑定机制可以使用INotifyPropertyChanged(INpc)开箱即用。

INpc顾名思义允许WPF检测对可能或不可能成为集合一部分的对象属性的更改。

ObservableCollection(OC)实现INotifyCollectionChanged(InCC),正如你所说的集合本身通知WPF(以及其他任何人配备处理更新)的更新项目集合(添加删除等)。如果OC包含本身不实现INpc的对象,那么WPF无法知道每个项目属性是如何改变的。

更新

在回答以下问题:“我们可以依赖的集合INPC事件,而不是在每个新项目的注册被通知?”答案是不。如果每个项目都没有在其属性上实现Inpc,那么WPF无法知道每个项目基础上哪些值发生了变化。

当项目被添加或删除部分时,WPF仍然会从OC中知道。 Items属性使用INpc来通知更新,就像在其属性上实现INpc的任何类一样。 InCC被实施来跟踪收集变化,而不是项目内每个项目的值。

9

如果你看看与反射器ObservableCollection<T>源代码,你可以看到,这个事件引发了两个属性:

this.OnPropertyChanged("Count"); 
this.OnPropertyChanged("Item[]"); 

注意ObservableCollection<T>工具INotifyPropertyChanged明确的,所以你只能通过访问PropertyChanged事件一个INotifyPropertyChanged变量:

INotifyPropertyChanged inpc = myObservableCollection; 
inpc.PropertyChanged += myEventHandler; 
+0

尽管事实上准确和简洁,我不知道这是如何回答“这是什么目的?” Q – Andrew 2009-12-20 19:50:26

+2

的一部分目的是通知订户集合已更改。在这方面,它与CollectionChanged事件具有相同的用途,但INotifyPropertyChanged比INotifyCollectionChanged – 2009-12-20 20:41:11

+0

更受支持,例如在某些情况下绑定到集合的计数。 – dan 2009-12-21 06:28:39

相关问题