WPF:运行 更改 DependencyProperty 时的代码

WPF: Run Code when DependencyProperty Is Changed

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

    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 上的另一个 属性。

当运行宁此功能永远不会达到。每次更改依赖项 属性 时,如何将代码获取到 运行?

Clr 属性 只是 DependencyProperty 的包装器,它通常被绕过,除非你直接在代码后面 get/set 属性。要在 属性 更改时处理某些事情,您需要提供一个 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 属性 包装器

一个解决方案是 运行 当 属性 改变时触发。查看 this MSDN article 了解更多信息、选项和示例。