【发布时间】: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 你应该这样回答。
-
克莱门斯,谢谢。如果您做出回答并引用该页面的报价,我很乐意接受您的回答。