5

我有一个控制ComboBox

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

这是OuterControl 中包含的PropertyChangedCallback属性:SelectedTraceComboBox

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

按照我的逻辑,应该会发生以下情况:

ComboBox我选择( )中的第三个对象SingleChannelList[2],然后发生更改处理程序。然后它进入UpdateSelectedTrace()例行程序。此时, 的值SelectedTrace当然是SingleChannelList[2]。现在,例程将属性UpdateSelectedTrace()强制设置为列表中的第一个对象 ( ),这会触发嵌套在第一个对象中的另一个更改处理程序。 “SelectedTrace”现在等于 SingleChannelList[0],因此 ComboBox 也应该将 SingleChannelList[0] 显示为其选择。SelectedTraceSingleChannelList[0]

当我跟随调试器直到最后一句粗体字出现时,所有这一切都会发生,而是像这样播放:

SelectedTrace现在等于SingleChannelList[0],但ComboBox显示SingleChannelList[2]为其选定项。我试过UpdatingTargetBindingExpression,但SelectedTrace属性仍然保持值SingleChannelList[0],而ComboBox继续显示SingleChannelList[2]。这些绑定是安全且经过测试的,并且在我尝试这样做之前一直有效。谁能告诉我为什么这不能正常工作?

谢谢

4

2 回答 2

2

这听起来像是依赖属性“值强制”的场景。值强制将属性的值“推”到基于期望值的有效值。在此处阅读更多信息:

依赖属性回调和验证

于 2010-01-13T15:48:56.787 回答
0

我相信这是 WPF 框架的性能优化。属性更新的来源不会让 propertychanged 事件(好吧,绑定等效)重新更新自身,因为它是更改的来源。您可以使用 Binding 中的 IdentityConverter(仅返回传入的值的 ValueConverter)强制更新。

于 2013-02-23T05:52:55.133 回答