调试一个奇怪的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事件期间发生。
答案 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! :)