WPF:在更改依赖项属性时运行代码

本文关键字:属性 运行 代码 依赖 WPF | 更新日期: 2023-09-27 18:18:28

在一个简单的用户控件中,我希望能够在依赖项属性更改时随时运行代码。

    public static readonly DependencyProperty Text1Property =
    DependencyProperty.Register("Text1", typeof(string), 
        typeof(BasicControl));
    public string Text1
    {
        get { return GetValue(Text1Property).ToString(); }
        set
        {                
            SetValue(Text1Property, value.ToString());
            OnPropertyChanged("Text2");
        }
    }

在本例中,Text2 是从 Text1 派生并显示在 UI 上的另一个属性。

运行此函数时,永远不会到达该函数。 如何让代码在每次更改依赖项属性时运行?

WPF:在更改依赖项属性时运行代码

Clr 属性只是 DependencyProperty 的包装器,除非您直接在代码隐藏中获取/设置属性,否则通常会绕过它。要在属性更改时处理某些内容,您需要提供一个包含某些属性更改回调的PropertyMetadata,如下所示:

public static readonly DependencyProperty Text1Property =
DependencyProperty.Register("Text1", typeof(string), 
    typeof(BasicControl), new PropertyMetadata(text1Changed));
//the text1Changed callback
static void text1Changed(DependencyObject o, DependencyPropertyChangedEventArgs e){
     var bc = o as BasicControl;
     if(bc != null) bc.OnPropertyChanged("Text2");
}

@King的回答很好,我想补充一些你应该知道的信息:

  • 如果您只想按 DP 备份属性并提供默认值值,使用PropertyMetadata

    • 如果要指定动画行为,请使用UIPropertyMetadata

    • 但是如果某些属性影响WPF框架级别的东西,例如元素布局、父布局或数据绑定,请使用 FrameworkPropertyMetadata

可以在 msdn http://msdn.microsoft.com/en-us/library/ms751554.aspx 上查看的详细信息

实现属性以使用依赖属性注册时,抵制将 set 访问器用于逻辑的诱惑!

换句话说,只有在过程代码中设置了属性时,才会调用set访问器。使用 XAML 设置属性、数据绑定等时,WPF 直接调用SetValue。这就是为什么没有达到该功能的原因...这就是为什么King King在上面的答案中提到你所拥有的只是一个.NET属性包装器。

解决方案可能是在属性更改时运行触发器。有关详细信息、选项和示例,请查看此 MSDN 文章。