【问题标题】:WPF ComboBox.SelectedValue is null but .SelectedItem is not; SelectedValuePath is set. Why?WPF ComboBox.SelectedValue 为 null 但 .SelectedItem 不是; SelectedValuePath 已设置。为什么?
【发布时间】:2014-11-06 00:32:38
【问题描述】:

调试一个奇怪的 NullRefException 我看到下图:

因此,当代码引用 .SelectedValue 时,它会崩溃。

我不明白如何设置.SelectedItem,但.SelectedValue 不行。调试器查看器中显示的值是正确的,.SelectedIndex 也是合适的。 ComboBox 的.ItemsSource 在代码中设置为List<DvcTypes>

cbAdmDvc.ItemsSource =  J790M.DAL.DvcTypes.GetList( );

.SelectedValuePath 在 XAML 中设置:

<ComboBox Name="cbAdmDvc" DisplayMemberPath="sDvcType"
  SelectedValuePath="tiDvcType" SelectionChanged="cbAdmDvc_SelectionChanged".. />

下拉部分稍后会正确显示.sDvcType 标签。
很多其他过滤组合框(另外 7 个)的实现非常相似。
这发生在主窗口的 Loaded 事件期间。

【问题讨论】:

    标签: wpf combobox .net-4.0


    【解决方案1】:

    到目前为止,我无法解释观察到的行为,但找到了一个相对简单的解决方法:

    private void    cbAdmDvc_SelectionChanged( object sender, SelectionChangedEventArgs e )
    {
        if(  cbAdmDvc.SelectedIndex < 0  )  return;
    
        DvcType tiDvc;      /// add this temp variable to capture .SelectedValue
    
        if(  cbAdmDvc.SelectedValue != null  )
            tiDvc=  (DvcType) cbAdmDvc.SelectedValue;
        else
            tiDvc=  ((DvcTypes) cbAdmDvc.SelectedItem).tiDvcType;
    
        DoSmth( tiDvc );    /// instead of DoSmth( (DvcType)cbAdmDvc.SelectedValue )
    }
    

    很傻,但它有效,因为 .SelectedItem 设置正确。
    正如我之前所说,这是几个 ComboBox 中唯一遇到这种奇怪现象的组合框。

    编辑,2014 年 10 月 21 日

    在对应用程序逻辑进行了一些更改后,我惊讶地发现自己在使用另一个 ComboBox 时遇到了同样的问题。找到了一个潜在的解决方案combobox-selectedvalue-not-updating-from-binding-source,但是当我尝试通过.SelectedItem 而不是.SelectedValue 设置初始值时,事情变得更加奇怪/更糟。所以我也尝试在这里应用我以前的解决方案并且它有效!

    这是我试图解释观察到的行为
    在代码中设置初始值 (CBox.SelectedValue= smth;) 会触发 CBox_SelectionChanged 事件。出于某种原因,当时阅读.SelectedValue 返回null(好像它还没有准备好),但是阅读.SelectedItem 似乎工作正常!一旦你离开CBox_SelectionChanged,事件代码就可以正确读取.SelectedValue..

    所以,如果您1) 有_SelectionChanged 事件的处理程序,2) 在其中引用.SelectedValue,然后3) 正在通过.SelectedValue 在代码中的其他位置设置初始选择 - 注意null 和防御性代码!嗯!! :)

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2019-09-12
      • 2011-02-23
      相关资源
      最近更新 更多