在该依赖属性的PropertyChangedCallback中更改依赖属性的值

5

我有一个带有 ComboBox 的控件:

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

这是在包含 ComboBox 的 OuterControl 中,用于属性 SelectedTrace 的 PropertyChangedCallback: PropertyChangedCallback
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]),这会触发嵌套在第一个处理程序内部的另一个更改处理程序。“SelectedTrace”现在等于SingleChannelList[0],因此ComboBox也应显示SingleChannelList[0]作为其选择。 当我一直跟着调试器走到粗体字的最后一句话时,所有这些都发生了,但实际上却像这样: SelectedTrace现在等于SingleChannelList[0],但ComboBox显示SingleChannelList[2]作为其选定项目。 我尝试在BindingExpression上进行UpdatingTarget,但是SelectedTrace属性仍然保持值SingleChannelList[0],而ComboBox继续显示SingleChannelList[2]。这些绑定是安全的、经过测试的,并且一直工作得很好,直到我尝试做这件事情。有人能告诉我为什么这不起作用吗?
谢谢
2个回答

2
这听起来像是使用依赖属性“值强制”功能的情况。该功能会根据所需值将属性的值“推送”到有效值。在此处阅读更多相关信息:依赖属性回调和验证

1
我发现,考虑到原始更改是来自于正在更改的盒子,这仍然不起作用。相反,在所有操作完成后,我只需硬编码设置该框,它就可以正常工作。虽然不太优雅但是有效。真正的问题是为什么我的原始场景不起作用? - Kamiikoneko

0

我相信这是WPF框架的性能优化。属性更新的源头不会收到属性更改事件(或者说绑定等效事件),以便重新更新自身,因为它是变化的源头。您可以在绑定中使用IdentityConverter(只返回传入值的ValueConverter)来强制进行更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接