为什么DependencyProperty会覆盖正常的属性绑定行为?

时间:2013-05-17 09:41:17

标签: wpf binding

我偶尔会遇到一个问题。这是一个简单的例子:

Xaml代码:

<Window x:Class="WPFProperties.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        x:Name="root">
    <Grid>
        <TextBox Text="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ElementName=root}"/>
    </Grid>
</Window>

代码背后:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    //// Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
    //public static readonly DependencyProperty TextProperty =
    //    DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new UIPropertyMetadata(null));

    private string _text;

    public string Text
    {
        get { return _text; }
        set 
        {
            if (this._text == value) return;
            _text = value;

            this.DoSomething();
        }
    }

    private void DoSomething()
    {
        // Do Someting
    }
}

在文本框中键入时,可以调用DoSomething()方法。但是,一旦我取消注释依赖属性“Text”,它就永远不会被调用。

注意:我知道依赖属性的基本用法。

2 个答案:

答案 0 :(得分:2)

你需要用回调创建UIPropertyMetaData(PropertyChangedCallback propertyChangedCallback),它应该是静态方法,你应该在其中调用传递的DependancyObject上的update属性

示例在此解释:MSDN

答案 1 :(得分:2)

AFAIK这里没有发生正常的属性声明,因为当DP被声明为static时,它会在创建正常对象之前就开始初始化,并且它具有优先权。

因此,类中的属性只被视为普通的DP帮助器属性,而不是看起来像新的类成员属性。因此,绑定内部仅使用内部SetValue(...)GetValue(...)直接绕过您的覆盖,这是DP的正常行为。

如果没有声明DP,那么这将成为该类的正常属性,并且我们会看到您的DoSomething()被调用。

如果我们在MainWindow的构造函数中调用Text = "Anything",即使DP定义没有被注释,我们也可以看到DoDomething()被调用,因为这就是DP调用本地帮助器的方式。只是绑定使用基本定义的