2015-10-20 84 views
2

在簡單的用戶控件中,我希望能夠在依賴項屬性發生更改時隨時運行代碼。WPF:在依賴項屬性發生變化時運行代碼

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

運行此功能時永遠不會達到此功能。我怎樣才能讓代碼在每次依賴屬性被更改時運行?

回答

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

@王的回答是不錯的,我想添加一些信息,你應該知道:

  • 如果你只是想通過DP背屬性並提供一個默認 值,使用PropertyMetadata

    • 如果要指定動畫行爲,使用UIPropertyMetadata

    • 但如果一些屬性影響WPF框架級別充塞例如,元素 佈局,父母佈局或綁定,使用FrameworkPropertyMetadata

詳細信息您可以查看MSDN上http://msdn.microsoft.com/en-us/library/ms751554.aspx

1

抵制使用set訪問邏輯的誘惑,實施物業時使用依賴屬性註冊!

換句話說,set訪問者只有在程序代碼中設置屬性時纔會被調用。當使用XAML,數據綁定等設置屬性時,WPF直接調用SetValue ......這就是爲什麼函數沒有被達到......這就是爲什麼King King提到你擁有的只是一個.NET屬性包裝his answer above

解決方案可能是在屬性更改時運行觸發器。查看this MSDN article瞭解更多信息,選項和示例。