在XAML中设置依赖项属性时,为什么在运行时绕过.NET属性包装器?
我正在读亚当·内森的书《WPF4释放》,第82页有以下警告: .NET属性包装器在运行时在XAML中设置依赖项属性时被忽略在XAML中设置依赖项属性时,为什么在运行时绕过.NET属性包装器?,.net,wpf,xaml,.net,Wpf,Xaml,我正在读亚当·内森的书《WPF4释放》,第82页有以下警告: .NET属性包装器在运行时在XAML中设置依赖项属性时被忽略 尽管XAML编译器依赖于 属性包装器在编译时,WPF调用底层 在运行时直接使用GetValue和SetValue方法!因此, 在XAML中设置属性和过程属性之间保持奇偶性 代码中,属性包装器不包含任何逻辑是至关重要的 添加到GetValue/SetValue调用。如果要添加自定义 逻辑上,这就是注册回调的目的。所有WPF的 内置属性包装器遵守此规则,因此此警告适用于 任何使
尽管XAML编译器依赖于 属性包装器在编译时,WPF调用底层 在运行时直接使用GetValue和SetValue方法!因此, 在XAML中设置属性和过程属性之间保持奇偶性 代码中,属性包装器不包含任何逻辑是至关重要的 添加到GetValue/SetValue调用。如果要添加自定义 逻辑上,这就是注册回调的目的。所有WPF的 内置属性包装器遵守此规则,因此此警告适用于 任何使用自己的依赖属性编写自定义类的人 我的问题是:为什么?WPF调用GetValue()/SetValue()而不是读取/设置CLR属性包装的原因是什么?如果原因是读取/设置属性包装器需要反射,那么WPF在构建对象树时会大量使用反射,那么绕过属性包装器直接调用GetValue()/SetValue()真的值得吗?或者避免反思不是这种行为的主要原因 UPD。Clemens很快给出了正确的答案,但我只想在该MSDN页面中添加一个引用(据我所知,StackOverflow更喜欢引用而不是链接): 通过xmlns和assembly的组合查找该类型 属性,但识别成员,确定哪些可以 支持设置为属性,并解析 否则,属性值支持将需要广泛的反映 使用PropertyInfo。因为给定类型上的依赖项属性是 可以通过属性系统WPF作为存储表访问 其XAML处理器的实现使用此表并推断 通过调用SetValue可以更有效地设置任何给定的属性ABC 在包含DependencyObject派生类型上,使用dependency 属性标识符ABCProperty
解释如下: 其XAML处理器的当前WPF实现本质上是 依赖属性感知。WPF XAML处理器使用属性系统 加载二进制XAML和 正在处理作为依赖项属性的属性。这有效地 绕过属性包装器。实现自定义依赖项时 属性,则必须说明此行为,并应避免 在属性包装器中放置除 属性系统方法GetValue和SetValue 以及: 出于实现的原因,在计算上降低了 将属性标识为依赖项属性并访问该属性 方法来设置它,而不是使用属性 包装器及其设置器。这是因为XAML处理器必须推断 支持代码的整个对象模型仅基于了解 结构所指示的类型和成员关系 标记和各种字符串
这在MSDN上有解释。@Clemens你应该回答这个问题。Clemens,谢谢。如果你能回答并引用那一页的话,我很乐意接受你的回答。