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

6

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

Double-shot to display .SelectedItem

当代码引用.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标签。
对于其他七个筛选组合框,同样的实现方式也适用。
这是在主窗口的加载事件中发生的。

2个回答

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 )
}

愚蠢,但它有效,因为.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并进行防御性编程!希望对您有所帮助! :)

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接