我在一个简单的WPF应用程序中第一次使用 INotifyPropertyChanged 。我想知道Binding内部是如何工作的。 CLR是否会检查具有 INotifyPropertyChanged 实现的任何类,并记录需要了解更改的订阅者?
当我在.NET 3.5上尝试过这个时,我读到了.NET 4.0提供的 IObserver 。 IObserver 比传统的 INotifyPropertyChanged 方式更优化吗?
答案 0 :(得分:2)
WPF绑定系统查找INotifyPropertyChanged接口,而不是CLR。 WPF绑定引擎有很多移动部分,但您可以假设BindingExpression是最终订阅PropertyChanged事件的部分。
IObserver接口提供的功能与INotifyPropertyChanged不同。后者用于指示属性值何时发生变化(非常具体的任务),前者用于定义泛型/可重用observer design pattern。
我不相信WPF绑定系统支持IObserver,我怀疑它会很快发生。
答案 1 :(得分:2)
INotifyPropertyChanged只是一个类可以实现的接口。由实现者决定如何处理实际的更改。
对于WPF,当创建单向绑定时,绑定对象将验证对象是否实现了INotifyPropertyChanged。如果是,它会附加一个事件处理程序。它可能是一个弱引用事件处理程序,因为内存泄漏问题,但让我们暂时跳过这个细节。更改PropertyChanged事件时,Binding对象将验证它具有的路径是否与来自事件的PropertyName相同。如果是,则绑定将获取值并通过Dispatcher将其发送到目标。 CLR本身并不关心事件是什么;它只是通过标准.Net事件订阅PropertyChanged事件。重要的一点是INotifyPropertyChanged,就像名称所暗示的那样,是特定的事件,表明对象的属性值已经改变。
IObserver接口用于通用通知。我猜这些通知 可以是属性通知,但它是一个非常通用的界面。
至于优化,一切都取决于实现,而不是接口本身。