You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:42:00