2012-02-27 61 views
0

只是想知道DependencyProperties。DependencyProperty PropertyChangedCallback vs將代碼直接放置到setter中

通常我在DependencyProperty更改後執行某些代碼時看到了這種編碼標準。

public int SomeProperty 
    { 
     get { return (int)GetValue(SomePropertyProperty); } 
     set { SetValue(SomePropertyProperty, value); } 
    } 

    public static readonly DependencyProperty SomePropertyProperty = 
     DependencyProperty.Register("SomeProperty", typeof(int), typeof(MainWindow), new UIPropertyMetadata(new DependencyPropertyChangedEventHandler(OnSomePropertyChanged))); 

    private static void OnSomePropertyChanged(object obj, DependencyPropertyChangedEventArgs e) 
    { 
     //Some logic in here 
    } 

但我不認爲我從來沒有見過這樣的實施 -

public int SomeProperty 
    { 
     get { return (int)GetValue(SomePropertyProperty); } 
     set 
     { 
      SetValue(SomePropertyProperty, value); 

      //Execute code in here 
     } 
    } 

    public static readonly DependencyProperty SomePropertyProperty = 
     DependencyProperty.Register("SomeProperty", typeof(int), typeof(MainWindow), new UIPropertyMetadata(0)); 

這被認爲是一種不好的做法?

謝謝!

回答

3

這不只是不好的做法,這實際上會導致不正確的行爲。當綁定到XAML中的依賴屬性時,SetValue方法將直接調用,而不是setter。基本上,你不能保證那裏的代碼甚至會被執行。

來源:http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-properties

一個側面說明這裏的一點點 - 永遠不要放任何東西,但 的GetValue和的SetValue的屬性包裝內調用。這是 ,因爲你永遠不知道是否有人通過 包裝器設置屬性,或者直接通過SetValue調用 - 所以你不希望 將任何額外的邏輯放在屬性包裝器中。例如,當您將XAML中依賴項屬性的值設置爲 時,它將不會使用 屬性包裝 - 它將直接觸發SetValue調用,繞過 碰巧放入屬性包裝中的任何東西。

+0

如果你綁定一個屬性它是'SetBinding' ... – 2012-02-28 01:18:05

相關問題