GetBindingExpression在第二次调用时返回null

时间:2014-02-19 05:49:31

标签: c# wpf binding

当在ComboBox SelectedValue属性上调用该函数时,我发现了GetBindingExpression()的奇怪行为。

它在第一次调用时工作正常,但是在返回的BindingExpression上调用UpdateTarget()之后,这个BindingExpression似乎从属性中删除了。下一次来自属性的GetBindingExpression()返回null。

BindingExpression exp;

// call it first time, returns an expression, and UpdateTarget success.
exp = ((ComboBox)obj).GetBindingExpression(ComboBox.SelectedValueProperty);

// call UpdateTarget
if (exp != null) exp.UpdateTarget();

// call it the second time, and now it returns null!
exp = ((ComboBox)obj).GetBindingExpression(ComboBox.SelectedValueProperty);

if (exp != null) exp.UpdateTarget();

如果我删除了UpdateTarget()的调用,那么下一个GetBindingingExpression()仍会返回一个有效的BindingExpression。

CheckBox的IsChecked属性不会发生这种问题。它总是与CheckBox的IsChecked属性一起使用。

XAML如下:

  <Style TargetType="{x:Type ComboBox}" x:Key="GainComboBoxStyle_0x00000022">
     <Setter Property="Height" Value="20" />
     <Setter Property="MaxWidth" Value="80" />
     <Setter Property="FontFamily" Value="Calibri"/>
     <Setter Property="FontSize" Value="15"/>
     <Setter Property="FontWeight" Value="UltraBold"/>
     <Setter Property="Tag" Value="{StaticResource moduleGain_0x00000022}" />
     <Setter Property="Visibility" Value="{Binding Mode=OneWay, Converter={StaticResource getVisibilityOfGainConverter}}"/>

     <Style.Triggers>
        <DataTrigger Binding="{Binding Mode=OneWay, Converter={StaticResource isShowingGain}}" Value="True">
           <Setter Property="SelectedValue" Value="{Binding Path=., RelativeSource={RelativeSource Mode=Self}, Mode=OneWay, Converter={StaticResource getGainValue}}"/>
           <Setter Property="DisplayMemberPath" Value="Name" />
           <Setter Property="SelectedValuePath" Value="Name" />
           <Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
           <Setter Property="ItemsSource" Value="{Binding Path=GainQ13Indices, Mode=OneTime}" />
        </DataTrigger>
     </Style.Triggers>
  </Style>

  <Style TargetType="{x:Type CheckBox}" x:Key="EnableCheckBoxStyle_0x00000010">
     <Setter Property="MaxWidth" Value="16"/>
     <Setter Property="Tag" Value="{StaticResource
                      moduleEnable_0x00000010}" />
     <Setter Property="Visibility" Value="{Binding Mode=OneWay, Converter={StaticResource getVisibilityOfEnableConverter}}"/>
     <Style.Triggers>
        <DataTrigger Binding="{Binding Mode=OneWay, Converter={StaticResource isShowingEnable}}" Value="True">
           <Setter Property="IsChecked" Value="{Binding Path=., RelativeSource={RelativeSource
                                          Mode=Self}, Mode=OneWay,
                                          Converter={StaticResource
                                          moduleEnableDisableConverter} }" />
        </DataTrigger>
     </Style.Triggers>
  </Style>

为什么UpdateTarget()从ComboBox的SelectedValue属性中删除BindingExpression?以及为什么它适用于CheckBox的IsChecked属性?

1 个答案:

答案 0 :(得分:1)

确保将SelectedValue设置为GainQ13Indices中包含的实际对象之一 - 看起来您可能在转换器中生成一个,这可能导致绑定中断。预计SelectedValue被设置为包含在与ItemsSource绑定的集合中的东西。

我猜它适用于IsChecked,因为它是一个布尔值,它是一个值类型,而它看起来像你在ComboBox中使用的是一个引用类型(其中相等性检查更复杂)。

之前我遇到过这些问题,而且我已经习惯在视图模型中暴露一个额外的属性来表示所暴露的每个列表的选定值,并避免尝试进行任何篡改在代码中绑定。

例如(在视图模型中):

public ObservableCollection<Gain> GainQ13Indices { get; private set; }

public Gain SelectedGainQ13Indice { get; set; }