【问题标题】:Why are .NET property wrappers bypassed at runtime when setting dependency properties in XAML?为什么在 XAML 中设置依赖属性时会在运行时绕过 .NET 属性包装器?
【发布时间】:2013-12-31 06:29:11
【问题描述】:

我正在阅读 Adam Nathan 的书“WPF 4 Unleashed”,第 82 页有以下警告:

在 XAML 中设置依赖属性时会在运行时绕过 .NET 属性包装器!
虽然 XAML 编译器依赖于 在编译时属性包装器,WPF 调用底层 运行时直接使用 GetValue 和 SetValue 方法!因此,对 在 XAML 和过程中设置属性之间保持相同 代码中,属性包装器不包含任何逻辑至关重要 除了 GetValue/SetValue 调用。如果要添加自定义 逻辑,这就是注册回调的用途。所有 WPF 的 内置属性包装器遵守此规则,因此此警告适用于 任何编写具有自己依赖属性的自定义类的人。

我的问题是:为什么? WPF 调用 GetValue()/SetValue() 而不是读取/设置 CLR 属性包装器的原因是什么?如果原因是读取/设置属性包装器需要反射,那么 WPF 在构造对象树时会大量使用反射,那么绕过使用属性包装器并直接调用 GetValue()/SetValue() 真的值得吗?或者避免反射不是这种行为的主要原因?

UPD。 Clemens 很快给出了正确答案,但我只想从那个 MSDN 页面再添加一个引用(据我了解,StackOverflow 更喜欢引用而不是链接):

通过xmlns和程序集的组合查找类型 属性,但识别成员,确定哪些可以 支持被设置为属性,并解析什么类型 否则,属性值支持将需要广泛的反思 使用 PropertyInfo。因为给定类型的依赖属性是 可通过属性系统 WPF 作为存储表访问 其 XAML 处理器的实现使用此表并推断 通过调用 SetValue 可以更有效地设置任何给定的属性 ABC 在包含的 DependencyObject 派生类型上,使用依赖项 属性标识符 ABCProperty。

【问题讨论】:

  • 这在 MSDN 上的XAML Loading and Dependency Properties 中有解释。
  • @Clemens 你应该这样回答。
  • 克莱门斯,谢谢。如果您做出回答并引用该页面的报价,我很乐意接受您的回答。

标签: .net wpf xaml


【解决方案1】:

解释在XAML Loading and Dependency Properties:

其 XAML 处理器的当前 WPF 实现本质上是 依赖属性感知。 WPF XAML 处理器使用属性系统 加载二进制 XAML 时依赖属性的方法和 处理作为依赖属性的属性。这有效地 绕过属性包装器。当您实现自定义依赖项时 属性,您必须考虑这种行为并应避免 将任何其他代码放在您的属性包装器中,而不是 属性系统方法 GetValue 和 SetValue。

和:

出于实现原因,计算成本更低 将属性标识为依赖属性并访问该属性 系统 SetValue 方法来设置它,而不是使用属性 包装器及其设置器。这是因为 XAML 处理器必须推断 支持代码的整个对象模型仅基于知道 由结构指示的类型和成员关系 标记和各种字符串。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2017-10-20
    • 2011-04-17
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多