Changing the value of a DependencyProperty inside the PropertyChangedCallback for that DependencyProperty
I have a control with a ComboBox
:
<ComboBox x:Name="TraceComboBox"
ItemsSource="{Binding SingleChannelList}"
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type cc:LogicTriggerSimpleLevelControl}},
Path=SelectedTrace, Mode=TwoWay}">
Here's the PropertyChangedCallback
for the Property SelectedTrace
in the OuterControl containing the ComboBox
:
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];
}
}
}
By my logic, the following should happen:
I select the 3rd object in the ComboBox
(SingleChannelList[2]
), and the change handler occurs. It then goes into the UpdateSelectedTrace()
routine. At this point, the value of SelectedTrace
is of course SingleChannelList[2]
. Now, the UpdateSelectedTrace()
routine forcibly sets the SelectedTrace
property to the 1st object in the list (SingleChannelList[0]
), which fires another change handler nested inside the first. "SelectedTrace" now equals SingleChannelList[0], and so the ComboBox should also show SingleChannelList[0] as its selection.
ALL of this happens when I follow with the debugger until the bold-faced last sentence, which instead plays out like this:
SelectedTrace
now equals SingleChannelList[0]
, but the ComboBox
displays 开发者_运维知识库SingleChannelList[2]
as its selected item. I tried UpdatingTarget
on the BindingExpression
and still, the SelectedTrace
Property holds the value SingleChannelList[0]
while the ComboBox
continues to show SingleChannelList[2]
. These bindings are secure and tested and have always worked until I tried to do this. Can anyone tell me why this doesn't work correctly?
Thank you
This sounds like a scenario for dependency property 'value coercion'. Value coercion 'pushes' the value of the property to a valid value based on a desired value. Read more about it here:
Dependency Property Callbacks and Validation
I believe this is a performance optimization by the WPF framework. The origin of the property update doesn't get a propertychanged event (well, the binding equivalent) to re-update itself, since it is the origin of the change. You can force an update using an IdentityConverter (ValueConverter that just returns the value passed in) in the Binding.
精彩评论