WPF:更改DependencyProperty时运行代码

时间:2015-10-20 15:16:48

标签: c# wpf wpf-controls dependency-properties

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

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

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

3 个答案:

答案 0 :(得分:2)

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");
}

答案 1 :(得分:2)

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

  • 如果您只想通过dp支持属性并提供默认值 值,使用PropertyMetadata

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

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

您可以在msdn http://msdn.microsoft.com/en-us/library/ms751554.aspx

上查看详细信息

答案 2 :(得分:1)

在实现属性以使用依赖项属性注册时,抵制使用set accessor for logic的诱惑!

换句话说,如果在过程代码中设置了属性,则仅调用set访问器。当使用XAML,数据绑定等设置属性时,WPF直接调用SetValue。这就是为什么函数没有到达...这就是为什么King King提到你拥有的只是一个.NET属性的原因his answer above中的包装器。

解决方案可能是在更改属性时运行触发器。查看this MSDN article了解更多信息,选项和示例。