Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在XAML中设置依赖项属性时,为什么在运行时绕过.NET属性包装器?_.net_Wpf_Xaml - Fatal编程技术网

在XAML中设置依赖项属性时,为什么在运行时绕过.NET属性包装器?

在XAML中设置依赖项属性时,为什么在运行时绕过.NET属性包装器?,.net,wpf,xaml,.net,Wpf,Xaml,我正在读亚当·内森的书《WPF4释放》,第82页有以下警告: .NET属性包装器在运行时在XAML中设置依赖项属性时被忽略 尽管XAML编译器依赖于 属性包装器在编译时,WPF调用底层 在运行时直接使用GetValue和SetValue方法!因此, 在XAML中设置属性和过程属性之间保持奇偶性 代码中,属性包装器不包含任何逻辑是至关重要的 添加到GetValue/SetValue调用。如果要添加自定义 逻辑上,这就是注册回调的目的。所有WPF的 内置属性包装器遵守此规则,因此此警告适用于 任何使

我正在读亚当·内森的书《WPF4释放》,第82页有以下警告:

.NET属性包装器在运行时在XAML中设置依赖项属性时被忽略
尽管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,谢谢。如果你能回答并引用那一页的话,我很乐意接受你的回答。