2010-09-27 58 views
2

想我再也以下的DependencyObject類型,爲什麼ValidateValueCallback調用兩次?

public class Test : DependencyObject 
{ 


    public int Order 
    { 
     get { return (int)GetValue(OrderProperty); } 
     set { SetValue(OrderProperty, value); } 
    } 

    public static readonly DependencyProperty OrderProperty = 
     DependencyProperty.Register("OrderProperty", 
     typeof(int), 
     typeof(Test), 
     new FrameworkPropertyMetadata(6, 
      new PropertyChangedCallback(OnOrderPropertyChanged), 
      new CoerceValueCallback(OnCoerceValueCallBack)), 
     new ValidateValueCallback(OnValidateValueCallBack)); 

    static void OnOrderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Console.WriteLine("OnOrderPropertyChanged"); 
    } 

    static object OnCoerceValueCallBack(DependencyObject d, object baseValue) 
    { 
     Console.WriteLine("OnCoerceValueCallBack"); 
     return 200; 
    } 

    static bool OnValidateValueCallBack(object value) 
    { 
     Console.WriteLine("OnValidateValueCallBack"); 
     int iValue = (int)value; 
     return iValue > 5; 
    } 
} 

當我創建測試的一個實例,我看到OnValidateValueCallBack被稱爲兩次,OnCoerceValueCallBack完全不叫。根據我所看到的,我猜想當我創建實例時,WPF將調用OnValidateValueCallBack來檢查默認值是否有效,如果是,它將使用默認值,根本不會調用CoerceValueCallback,那麼第二個來電OnValidateValueCallBack來自哪裏?

+0

設置一個斷點並使用堆棧跟蹤。 – Val 2010-09-27 13:21:33

回答

1

我可以證實這種行爲。在註冊一個依賴項屬性後,驗證回調將由WPF的內部調用。 無論傳遞的元數據如何,總是會發生一次調用僅當帶有元數據的默認值被傳遞時纔會發生第二個調用。

最初我以爲第一次調用是由於WPF的內部初始化,所以它始終是該類型的默認值。不是這種情況! 在第一次調用中傳遞的對象是該類型的默認值或在元數據中指定的默認值。第二個調用似乎更合乎邏輯,只是傳遞了默認值。

在註冊時不會調用強制或更改的回調。

第一次電話的用途對我來說是個謎。

Relevant (unanswered) question on msdn。

相關問題