【问题标题】:Changing the value of a DependencyProperty inside the PropertyChangedCallback for that DependencyProperty更改该 DependencyProperty 的 PropertyChangedCallback 中的 DependencyProperty 的值
【发布时间】:2011-01-04 16:47:47
【问题描述】:

我有一个带有ComboBox 的控件:

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

这是包含 ComboBox 的 OuterControl 中属性 SelectedTracePropertyChangedCallback

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],但ComboBoxSingleChannelList[2] 显示为其选定项。我在BindingExpression 上尝试了UpdatingTarget,但SelectedTrace 属性仍然保留SingleChannelList[0] 的值,而ComboBox 继续显示SingleChannelList[2]。这些绑定是安全且经过测试的,并且在我尝试这样做之前一直有效。谁能告诉我为什么这不能正常工作?

谢谢

【问题讨论】:

    标签: wpf data-binding binding dependency-properties onchange


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      Dependency Property Callbacks and Validation

      【讨论】:

      • 我发现,原来的变化源于正在变化的盒子,这仍然行不通。相反,我只是在一切完成后硬设置盒子,它工作正常。哈克但有效。真正的问题是为什么我原来的场景不起作用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多