绑定到依赖属性魔术

本文关键字:魔术 属性 依赖 绑定 | 更新日期: 2023-09-27 18:25:10

我有一个依赖属性:

public bool IsApproved //Dependency property
{
    get { return (bool)GetValue(IsApprovedProperty); }
    set { SetValue(IsApprovedProperty, value); }
}
public static readonly DependencyProperty IsApprovedProperty =
    DependencyProperty.Register("IsApproved", typeof(bool), typeof(MyClass), new UIPropertyMetadata(true));

和绑定到此属性的2个控件:

当我选中/取消选中复选框时,mypanel的可见性会发生变化,并且可以。但是,当我将断点放入IsApproved的get和set中时,它从未停止过。

它是如何工作的?

感谢

绑定到依赖属性魔术

来自MSDN:

因为XAML处理器行为的当前WPF实现对于属性设置完全绕过包装器,您不应该将任何附加逻辑放入的包装器的集合定义中您的自定义依赖项属性。如果你把这样的逻辑放在集合中定义,则当属性为在XAML中设置,而不是在代码中设置。

换句话说,该框架不使用CLR包装器属性。如果您通过代码直接设置CLR属性,那么set逻辑当然会运行。要检测框架对属性的更改,需要在注册期间使用元数据属性注册PropertyChanged回调。

WPF数据绑定系统直接通过SetValue()修改DependencyProperties,而不需要经过属性设置器(实际上不需要存在)。

要查看更改,请在UIPropertyMetadata中添加回调。