2010-01-13 5 views
5

ich ein Steuerelement mit einem ComboBox haben:Ändern des Wertes eines DependencyProperty innerhalb des PropertyChangedCallback für die DependencyProperty

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

Hier ist die PropertyChangedCallback für Immobilien SelectedTrace im OuterControl die ComboBox enthält:

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]; 
     } 
    } 
} 

Nach meiner Logik sollte folgendes passieren:

I selec t das dritte Objekt in der ComboBox (SingleChannelList[2]), und der Change-Handler tritt auf. Es geht dann in die UpdateSelectedTrace() Routine. An diesem Punkt ist der Wert SelectedTrace natürlich SingleChannelList[2]. Jetzt setzt die UpdateSelectedTrace()-Routine zwangsweise die SelectedTrace -Eigenschaft auf das erste Objekt in der Liste (SingleChannelList[0]), das einen anderen Änderungshandler auslöst, der in der ersten verschachtelt ist. "SelectedTrace" entspricht nun SingleChannelList [0], daher sollte ComboBox auch SingleChannelList [0] als Auswahl anzeigen.

All dies geschieht, wenn ich mit dem Debugger, bis dem bold-faced letzten Satz folgen, die stattdessen wie folgt ausspielt:

SelectedTrace jetzt gleich SingleChannelList[0], aber die ComboBox zeigt SingleChannelList[2] als ausgewähltes Element. Ich versuchte UpdatingTarget auf der BindingExpression und noch, die SelectedTrace Eigenschaft hält den Wert SingleChannelList[0], während die ComboBox weiterhin SingleChannelList[2] zeigt. Diese Bindungen sind sicher und getestet und haben immer funktioniert, bis ich das versuchte. Kann mir jemand sagen, warum das nicht richtig funktioniert?

Danke

Antwort

2

Das klingt wie ein Szenario für die Abhängigkeitseigenschaft ‚Wert Zwang‘. Der Wertzwang "schiebt" den Wert der Eigenschaft auf einen gültigen Wert basierend auf einem gewünschten Wert. Lesen Sie mehr darüber hier:

Dependency Property Callbacks and Validation

+1

Ich fand, dass, da die ursprüngliche Änderung von der Box stammt, die sich ändert, dies immer noch nicht funktioniert. Stattdessen setze ich die Box einfach fest, nachdem alles fertig ist und es funktioniert gut. Hacky aber funktioniert. Die eigentliche Frage lautet: WARUM funktioniert mein ursprüngliches Szenario nicht? – Kamiikoneko

0

Ich glaube, das von dem WPF Rahmen eine Performance-Optimierung ist. Der Ursprung der Eigenschaftenaktualisierung erhält kein propertychanged-Ereignis (nun, das bindende Äquivalent), um sich selbst neu zu aktualisieren, da es der Ursprung der Änderung ist. Sie können eine Aktualisierung mit einem IdentityConverter (ValueConverter, der nur den übergebenen Wert zurückgibt) in der Bindung erzwingen.