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

Ast*_*tor 5 wpf combobox .net-4.0

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

双击显示.SelectedItem

所以当代码引用.SelectedValue它崩溃时.

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

cbAdmDvc.ItemsSource =  J790M.DAL.DvcTypes.GetList( );
Run Code Online (Sandbox Code Playgroud)

.SelectedValuePath 在XAML中设置:

<ComboBox Name="cbAdmDvc" DisplayMemberPath="sDvcType"
  SelectedValuePath="tiDvcType" SelectionChanged="cbAdmDvc_SelectionChanged".. />
Run Code Online (Sandbox Code Playgroud)

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

Ast*_*tor 4

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

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 )
}
Run Code Online (Sandbox Code Playgroud)

愚蠢,但它有效,因为.SelectedItem设置正确。
正如我之前所说,这是几个 ComboBox 中唯一遇到这种奇怪情况的 ComboBox。

编辑,2014 年 10 月 21 日

在对应用程序逻辑进行一些更改后,我惊讶地发现自己在另一个 ComboBox 中遇到了同样的问题。找到了一个潜在的解决方案组合框选择值不更新从绑定源,但是当我尝试通过而不是设置初始值时,.SelectedItem事情.SelectedValue变得更奇怪/更糟糕。所以我也尝试在这里应用我以前的解决方案并且它有效!

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

因此,如果您1)有一个事件处理程序_SelectionChanged2.SelectedValue )在其中引用,并且3)通过代码中的其他位置设置初始选择.SelectedValue- 请注意null并进行防御性编码!呵呵!!:)