2013-12-22 84 views
1

我正在開發一個Windows Phone 8應用程序。我在我的UserControl中使用了DependencyProperty。我發現PropertyMetadata的構造函數中的PropertyChangedCallback僅在屬性值更改時觸發。我有這個問題。Windows Phone 8,爲用戶控件使用DependencyProperty,PropertyChangedCallback和CoerceValueCallback問題

public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
     "IsSelected", typeof(bool), 
     typeof(WCCSelectableButtonImageText), 
     new PropertyMetadata(
      false, 
      new PropertyChangedCallback(IsSelectedPropertyChanged)) 
     ); 

在我的代碼,我有一個屬性IsSelected,我想將該值設置爲它的時候做一些事情,不管值爲default或改變。但根據this,我們知道我們不能在包裝器的集合定義中做任何事情。我也發現this,我敢肯定CoerceValueCallback將被稱爲不管屬性是默認或更改。但在Windows Phone SDK中,我發現我不能使用CoerceValueCallback。有人知道如何在設置值爲DependencyProperty時調用函數?非常感謝您

回答

4

假設IsSelectedPropertyChanged符合

protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 

的問題是,因爲這種方法是靜態的它是無法訪問類的變量。由於與DependencyProperty相關的實際屬性(變量)本身不是靜態的,因此靜態屬性更改處理程序不知道特定於實例的屬性/變量。

即IsSelected是一個實例屬性,但DependencyProperty IsSelectedProperty是靜態的,其值改變的回調也是靜態的。

public bool IsSelected 
{ 
    get{(bool)GetValue(IsSelectedProperty)} 
    set{SetValue(IsSelectedProperty, value)} 
} 

public static readonly DependencyProperty IsSelectedProperty = 
     DependencyProperty.Register("IsSelected", typeof(bool), type(thisCustomControlClassName), new PropertyMetadata(false, thisCustomControlClassName.IsSelectedPropertyChanged); 

protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 

所以你不能做到以下幾點:

protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    IsSelected = true; //(IsSelected (instance properties) not available in the body of a static method) 
} 

的解決方案是投的DependencyObject參數作爲類的實例,那麼你就可以訪問它的所有實例屬性和方法。

的DependencyPropertyChangedEventArgs將包含狀態變化

e.OldValue 

和用於IsSelectedProperty在

e.NewValue 

新值,其中e.NewValue和e.OldValue是類型的前IsSelectedProperty的值對象,並需要將其轉換爲您期望的類型(在本例中爲bool)。

protected static void IsSelectedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    var control = (thisCustomControlClassName)o; 
    control.IsSelected = (bool)e.NewValue; 
} 
相關問題