2013-05-17 90 views
3

我偶爾遇到問題。這裏是一個簡單的例子:爲什麼DependencyProperty會覆蓋正常的屬性綁定行爲?

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的()可以被調用,在文本框打字時。但是,一旦我取消註釋依賴屬性「文本」,它永遠不會被調用。

注:我知道依賴屬性的基本用法。

+0

檢查此http://www.wpftutorial.net/DependencyProperties.html。也許你會知道一些關於依賴屬性的東西 – blindmeis

回答

2

你需要用的回調(PropertyChangedCallback propertyChangedCallback),這應該是靜態方法中,你應該呼籲通過DependancyObject更新財產

例子在這裏解釋創建UIPropertyMetaData:MSDN

2

那麼據我所知是沒有正常屬性聲明發生在這裏,因爲當聲明一個DP時,它是static,在創建正常對象之前它會在一開始就被初始化,並且它有優先權。

因此,類中的屬性只是作爲一個普通的DP幫助屬性,而不是看起來像一個新的類成員屬性。因此,綁定內部僅使用內部SetValue(...)GetValue(...)直接繞過您的覆蓋,這是DP的正常行爲。

當沒有聲明DP時,這成爲該類的正常屬性,並且我們看到你的DoSomething()被調用。

即使DP定義沒有被評論,如果我們在MainWindow的構造函數中調用Text = "Anything",我們可以看到DoDomething()被調用,因爲這是DP調用本地幫助程序的方式。只是綁定的使用基本定義的

相關問題