内部绑定如何工作? IObserver是否比传统的INotifyPropertyChanged更优化?

时间:2011-08-02 11:03:59

标签: .net

我在一个简单的WPF应用程序中第一次使用 INotifyPropertyChanged 。我想知道Binding内部是如何工作的。 CLR是否会检查具有 INotifyPropertyChanged 实现的任何类,并记录需要了解更改的订阅者?

当我在.NET 3.5上尝试过这个时,我读到了.NET 4.0提供的 IObserver IObserver 比传统的 INotifyPropertyChanged 方式更优化吗?

2 个答案:

答案 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接口用于通用通知。我猜这些通知 可以是属性通知,但它是一个非常通用的界面。

至于优化,一切都取决于实现,而不是接口本身。