开发者

Changing the value of a DependencyProperty inside the PropertyChangedCallback for that DependencyProperty

开发者 https://www.devze.com 2022-12-16 11:40 出处:网络
I have a control with a ComboBox: <ComboBox x:Name=\"TraceComboBox\" ItemsSource=\"{Binding SingleChannelList}\"

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消