2010-08-05 56 views
1

在這篇文章中,問題的核心是你是否可以期望在設置其中一個屬性回調的時候設置所有的DP。我問這是因爲這不是我所看到的行爲。DependencyProperty的依賴關係和PropertyCallbacks

一類有兩個DP的,這兩者在XAML設置,就像這樣:

<!-- Days of the Week --> 
<local:DayOfTheWeekColumn 
    DowIndex="0" 
    ActivityCollection="{Binding Source={StaticResource spy}, Path=DataContext}" 
    ....      
/> 

在DayOfTheWeekColumn類,DPS的聲明像這樣,現在:

public static readonly DependencyProperty DowIndexProperty = DependencyProperty.RegisterAttached(
     "DowIndex", typeof(string), typeof(DayOfTheWeekColumn), 
     new PropertyMetadata(OnDowIndexSet), IsIndexValid); 

    public static readonly DependencyProperty ActivityCollectionProperty = DependencyProperty.RegisterAttached(
     "ActivityCollection", typeof(IActivityCollectionViewModelBase), typeof(DayOfTheWeekColumn), 
     new PropertyMetadata(OnActivityCollectionSet)); 

當OnDowIndexSet回調執行時,ActivityCollectionProperty仍然爲空,但是當OnActivityCollectionSet回調執行時,DowIndexProperty被賦值。我需要兩個屬性來完成這個用例。這裏是OnActivityCollectionSet:

private static void OnActivityCollectionSet(DependencyObject target, DependencyPropertyChangedEventArgs e) { 
     var context = (IActivityCollectionViewModelBase) e.NewValue; 
     var col = (DayOfTheWeekColumn) target; 
     var index = Convert.ToInt32(col.DowIndex); 
     _setHeader(col, context, index); 
    } 

現在這個作品,但它是脆弱的我,只要我不明白,在回調執行時間設置兩個屬性的時機。爲什麼兩個屬性都可用於OnActivityCollectionSet而不是OnDowIndexSet?

乾杯,
Berryl

回答

1

也許之前DowIndex在XAML ActivityCollection之前設置?

你不能使用默認的DependencyProperty值來防止這個問題嗎?

而小OT提示:路徑綁定屬性是一個默認的,所以你可以使用這個符號更短:

ActivityCollection="{Binding DataContext, Source={StaticResource spy}}" 
+0

重:XAML排序。我也會這麼想,但在這種情況下並不重要; DowIndexProperty總是首先獲得它的價值。我沒有看到它應該這樣做的理由,但它確實如此。 – Berryl 2010-08-06 20:59:01

+0

默認DependencyProperty。你的意思是DataContext?如果是這樣,DataGridColumn不是一個FrameworkElement,所以沒有免費的。出於同樣的原因,您也無法爲其設置樣式。其中一個主要原因是我已經把它作爲一個子類與DPs – Berryl 2010-08-06 21:01:36

+0

重新sysntax。是的,你是對的,這是一個更可讀的綁定。乾杯 – Berryl 2010-08-06 21:02:05