2010-01-13 36 views
5

我有一個ComboBox控制:更改PropertyChangedCallback內DependencyProperty的價值爲DependencyProperty的

<ComboBox x:Name="TraceComboBox" 
      ItemsSource="{Binding SingleChannelList}" 
      SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type cc:LogicTriggerSimpleLevelControl}}, 
         Path=SelectedTrace, Mode=TwoWay}"> 

這裏是在OuterControl包含ComboBoxPropertyChangedCallback該物業SelectedTrace

private static void OnSelectedTraceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    OuterControl oc = d as OuterControl ; 
    oc.UpdateSelectedTrace(); 
} 

private void UpdateSelectedTrace() 
{ 
    ViewModelType vm = DataContext as ViewModelType; 
    if (vm != null) 
    { 
     if (vm.SingleChannelList != null) 
     { 
      SelectedTrace = vm.SingleChannelList[0]; 
     } 
    } 
} 

按照我的邏輯,下列情況應該發生:

我選擇t ComboBoxSingleChannelList[2])中的第3個對象,並且發生更改處理程序。然後進入UpdateSelectedTrace()例程。此時,SelectedTrace的值當然是SingleChannelList[2]。現在,UpdateSelectedTrace()例程強制將SelectedTrace屬性設置爲列表中的第一個對象(SingleChannelList[0]),該對象觸發嵌套在第一個對象中的另一個更改處理程序。 「SelectedTrace」現在等於SingleChannelList [0],因此ComboBox也應顯示SingleChannelList [0]作爲其選擇。

這一切發生時,我遵循與調試,直到黑體最後一句,這反而發揮出這樣的:

SelectedTrace現在等於SingleChannelList[0],但ComboBox顯示SingleChannelList[2]作爲其選定的項目。我在BindingExpression上試過UpdatingTarget,仍然SelectedTrace屬性值爲SingleChannelList[0],而ComboBox繼續顯示SingleChannelList[2]。這些綁定是安全和測試,並一直工作,直到我試圖做到這一點。任何人都可以告訴我爲什麼這不能正常工作?

謝謝

回答

2

這聽起來像是依賴屬性'價值強制'的情景。價值強制將「財產」的價值推到基於期望價值的有效價值。瞭解更多關於在這裏:​​

Dependency Property Callbacks and Validation

+1

我發現,假設原來的變化源自正在改變的框,這仍然不起作用。相反,我只是在完成所有工作後很難設置盒子,並且工作正常。克里,但工作。真正的問題是爲什麼我的原始方案沒有工作? – Kamiikoneko 2010-01-15 14:08:48

0

我相信這是由WPF框架性能優化。屬性更新的起源沒有得到一個propertychanged事件(當然,綁定等價物)來重新更新自身,因爲它是更改的起源。您可以在Binding中使用IdentityConverter(ValueConverter,它只返回傳入的值)強制更新。

相關問題