English 中文(简体)
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.





相关问题
WPF convert 2d mouse click into 3d space

I have several geometry meshes in my Viewport3D, these have bounds of (w:1800, h:500, d:25). When a user clicks in the middle of the mesh, I want the Point3D of (900, 500, 25)... How can I achieve ...

Editing a xaml icons or images

Is it possible to edit a xaml icons or images in the expression design or using other tools? Is it possible to import a xaml images (that e.g you have exported) in the expression designer for editing?...

WPF: writing smoke tests using ViewModels

I am considering to write smoke tests for our WPF application. The question that I am faced is: should we use UI automation( or some other technology that creates a UI script), or is it good enough to ...

WPF - MVVM - NHibernate Validation

Im facing a bit of an issue when trying to validate a decimal property on domain object which is bound to a textbox on the view through the viewmodel. I am using NHibernate to decorate my property on ...

How do WPF Markup Extensions raise compile errors?

Certain markup extensions raise compile errors. For example StaticExtension (x:Static) raises a compile error if the referenced class cannot be found. Anyone know the mechanism for this? Is it baked ...

WPF design-time context menu

I am trying to create a custom wpf control, I m wondering how I can add some design-time features. I ve googled and can t seem to get to my goal. So here s my simple question, how can I add an entry ...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...

热门标签