【问题标题】:How Binding internally works? Is IObserver more optimized than traditional INotifyPropertyChanged?绑定内部如何工作? IObserver 是否比传统的 INotifyPropertyChanged 更优化?
【发布时间】:2011-08-02 11:03:58
【问题描述】:

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

当我在 .NET 3.5 上尝试此操作时,我了解到 IObserver 可用于 .NET 4.0。 IObserver 是否比传统的 INotifyPropertyChanged 方式更优化?

【问题讨论】:

标签: .net


【解决方案1】:

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

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

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

至于优化,这完全取决于实现,而不是接口本身。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2017-02-09
      • 2016-01-27
      • 2019-04-23
      • 2020-03-10
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多