WPF ComboBox绑定自定义类集合后无法正确获取选中值如何解决?
问题原因
空引用异常原因
你绑定ComboBox的数据源是ObservableCollection<Choice>类型的自定义类集合,此时控件的SelectedItem/SelectedValue存储的是选中项对应的Choice类实例,并非WPF原生的ComboBoxItem控件对象。你将其强制转换为ComboBoxItem时会得到null,访问null的Content属性就会触发空引用异常。
返回类名字符串原因
自定义类未重写ToString()方法时,默认调用的object基类ToString()实现会返回类的全限定名,也就是你看到的PoolBet.MainWindow+Choice,无法得到你要的ChoiceName属性值。
另外你的XAML写法存在冗余:ItemTemplate内部不需要手动声明ComboBoxItem,ComboBox渲染时会自动为每个数据项包裹ComboBoxItem容器,你直接放展示控件即可。
正确解决方案
有两种常用的实现方式,任选其一即可:
方式1:直接转换选中项为Choice类实例取值
直接将选中项转成对应业务类,再访问其ChoiceName属性,代码如下:
var selectedChoice = ChoicesList.SelectedItem as Choice; // 增加判空避免未选中时触发异常 if (selectedChoice != null) { Bets.Add(new Bet() { Name = nameInput.Text, Amount = amount, Choice = selectedChoice.ChoiceName }); }
方式2:通过SelectedValuePath配置直接取值
先修改ComboBox的XAML声明,增加SelectedValuePath属性指定要取值的属性名:
<ComboBox Name="ChoicesList" Grid.Column="2" Grid.Row="2" Margin="0,0,10,10" SelectedValuePath="ChoiceName"> <ComboBox.ItemTemplate> <DataTemplate> <!-- 替换冗余的ComboBoxItem为TextBlock即可 --> <TextBlock Text="{Binding ChoiceName}" /> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox>
后台直接获取SelectedValue即可得到ChoiceName的值:
Bets.Add(new Bet() { Name = nameInput.Text, Amount = amount, Choice = ChoicesList.SelectedValue?.ToString() });
内容的提问来源于stack exchange,提问作者SpaceNerden
相关产品推荐
相关产品推荐

