WPF ComboBox.SelectedValue为null,但.SelectedItem不为; SelectedValuePath已设置。为什么?

时间:2014-09-11 22:27:25

标签: wpf combobox .net-4.0

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

Double-shot to display .SelectedItem

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

我无法理解如何设置.SelectedItem,但.SelectedValue不能。调试器查看器中显示的值是正确的,.SelectedIndex也是合适的。 ComboBox&#39; .ItemsSource在代码中设置为List<DvcTypes>

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

.SelectedValuePath在XAML中设置:

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

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

1 个答案:

答案 0 :(得分:3)

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

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 ..

EDIT,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并进行防御性编码! HTH! :)