WPF:当DependencyProperty改变时运行代码

3
在一个简单的用户控件中,我希望能够在任何依赖属性更改时运行代码。
    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个回答

3

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

2
@King的回答很好,我想补充一些你应该知道的信息:
  • 如果您只想通过dp返回属性并提供默认值,请使用PropertyMetadata

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

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

详情请参阅msdn http://msdn.microsoft.com/en-us/library/ms751554.aspx


2
抵制诱惑,不要在实现使用依赖属性注册的属性时,使用设置访问器来进行逻辑操作!
换句话说,如果属性是在过程代码中设置的,那么只有当调用set访问器时才会被调用。当使用XAML、数据绑定等方式设置属性时,WPF会直接调用SetValue。这就是为什么函数没有被调用的原因...也是为什么King King在他上面的答案中提到你所拥有的只是一个.NET属性包装器。
解决方案可能是在属性更改时运行触发器。查看此MSDN文章以获取更多信息、选项和示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接