2011-08-02 27 views
1

我在一个简单的WPF应用程序中首次使用了INotifyPropertyChanged。我想知道Binding在内部的工作原理。它是否是CLR,用于检查任何具有INotifyPropertyChanged实现的类并记录需要被通知有关更改的订户?绑定内部如何工作? IObserver比传统的INotifyPropertyChanged更优化吗?

虽然我在.NET 3.5上试过这个,但我读到了有关.NET 4.0可用的IObserver的。是IObserver比传统INotifyPropertyChanged方式更优化吗?

+0

的可能重复[的IObservable 和INotifyPropertyChanged的 - 有一个连接(http://stackoverflow.com/questions/2162796/iobservablet-and-inotifypropertychanged-is-there-a-connection) – gbjbaanb

+0

号我曾问如何绑定内部工作。我的问题的前一部分是关于内部工作,后者是关于表现。我不是在问差别。 – RKh

回答

2

INotifyPropertyChanged只是一个类可以实现的接口。由实施者决定如何处理实际变化。

对于WPF,创建单向绑定时,绑定对象验证对象是否实现INotifyPropertyChanged。如果是这样,它会附加一个事件处理程序。它可能是一个弱引用事件处理程序,因为内存泄漏问题,但现在让我们跳过这个细节。当PropertyChanged事件发生变化时,Binding对象验证它所拥有的路径与来自事件的PropertyName相同。如果是,则绑定获取该值并通过分派器将其发送到目标。 CLR本身并不关心事件是什么;它只是通过标准的.Net事件订阅PropertyChanged事件。重要的一点是INotifyPropertyChanged就像名称所暗示的那样是特定的事件,以指示对象的属性值已更改。

IObserver接口用于通用通知。这些通知可以,我猜是属性通知,但它意味着是一个非常通用的接口。

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

2

WPF绑定系统查找INotifyPropertyChanged接口,而不是CLR。 WPF绑定引擎具有许多移动部分,但您可以假定BindingExpression是最终订阅PropertyChanged事件的那个。

IObserver接口提供与INotifyPropertyChanged不同的功能。后者用于表示属性值何时发生变化(非常具体的任务),前者用于定义通用/可重用的observer design pattern

我不相信WPF绑定系统支持IObserver,我怀疑它会很快。

相关问题