一、ComboBox简介

ComboBox允许用户从下拉列表中选择项,或根据需要在控件的文本框中输入新文本。 ComboBox 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。

二、ComboBox属性

name Value
IsEditable 获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑。
IsEnabled 获取或设置一个值,该值指示是否 用户界面 (UI) 中启用此元素。 这是依赖项属性。(继承自 UIElement)
SelectedIndex 获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。(继承自 Selector)
SelectedItem 获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。(继承自 Selector)
SelectedValue 获获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。(继承自 Selector)
SelectedValuePath 获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。(继承自 Selector)
Text 获取或设置当前选定项的文本。

三、SelectionChanged事件

当用户选择下拉选项中选项时,如果需要对特定选项执行一些功能,就需要用到SelectionChanged事件,用来监视用户选择。
在这个事件中可以使用SelectedValue.ToString()语句,将选项转换为字符串,获取用户选项。但如果需要同时实现可以手动编辑选项,即将IsEditable设置为true,这时程序就会报错,如下图所示。
未将对象引用设置到对象的实例
爆出未将对象引用设置到对象的实例的错误,这是因为编辑输入的内容不在初始选项内,使用获取选项的SelectedValue为null,所以会爆错。这时可以使用Text来获取选项,但在实际使用时发现获取到的选项,是当前选项之前的一个选项,无法获取到当前选项。

四、上述问题解决方法

可以在SelectionChanged事件中,使用SelectedValue.ToString()获取当前选项,但需要在事件中开始位置判断SelectedValue是否为null,如是,则程序返回,在其他代码段使用Text获取用户输入编辑的内容。

private void MySelectionChanged(object sender, SelectionChangedEventArgs e)
if (this.ComboBox.SelectedValue == null)
                return;
            MessageBox.Show(SelectedValue.ToString());

五、参考资料

微软文档ComboBox 类
Combobox SelectionChanged problem with IsEditable
ComboBox Editable Percentage

今早迁移一个WinForm项目到WPFComboBox控件的SelectedIndexChanged事件迁移为SelectionChanged事件后出现了奇怪的栈错误。经查明是SelectionChanged事件WPF页面加载完成之前会自动执行一次,我们并不希望这样。 以下方法可避免SelectionChanged事件的第一次执行: private void... 今早迁移一个WinForm项目到WPFComboBox控件的SelectedIndexChanged事件迁移为SelectionChanged事件后,出现了奇怪的栈错误。经查明是SelectionChanged事件WPF页面加载完成之前会自动执行一次,我们并不希望这样以下方法可避免SelectionChanged事件的第一次执行:private void DevicesComboBox_Sel... WPF开发经常会用到ListBox, 很多需求会涉及ListBox产生一些事件,其实这些都是很简单的,下面以选事件为例。看上去很简单,就几行代码,使用起来更简单,快用起来吧。前段比如有一个ListBox如下。 一般而言,ComboBox的SelectionChanged事件都應檢查ComboBox是否被打開,若沒打開則不作任何動作,方法可以參考以下 private void SupplierComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)             // IsDropD xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 前台view页面的ComboBox : <ComboBox Height="23" Margin="121.465,21.435,160.048,0" Ve... WPF ComboBox控件有许多需要注意,WPF的SelectionChanged事件与WinForm的SelectedIndexChanged也不完全相同。 WPF ComboBox控件SelectionChanged事件获取的文本为上一次文本,即选择项还未发生改变,有两种解决方法,一种手动赋值 //cobType为comboBox控件名 cobType.Text = cobTyp... 最近做项目遇到了一个问题:使用combobox的选择事件时会发生选择的item更新不及时的现象,解决方法: if (comboBox.Text != "") { comboBox.Text = ((ComboBoxItem)comboBox.SelectedItem).Content.ToString(); &lt;local:PreviewComboBox VerticalAlignment="Center" Width="100" &gt; &lt;ComboBoxItem Content="1"&gt;&lt;/ComboBoxItem&gt; &lt;ComboBoxItem Content="2"&gt; 最近在做WPF项目,有一个需求是用户在文本框搜索的时候,弹出下拉框预测用户想输入的信息,一开始想用TextBox做,后来觉得写下拉框的UI太麻烦了,于是换了一种思路,改用ComboBox做,只要每次在文本改变时换一下他的ItemsSource即可。 一开始迟迟找不到ComboBox的TextChanged事件,用的是keyUp来做,每次keyUp时获取ComboBox的文本内容,但是这样会有种种bug,后来用了TextChanged后完美解决。 TextBoxBase.TextChang View层: xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity <ComboBox x:Name="comboBox1" Height="23" Width="120" SelectedValuePath="StuId" DisplayMemberPath="StuName" ItemsSource="{Binding StudentList}"> <i:Interaction.Triggers> <DataGrid Name="DG1" Grid.Row="5" Grid.ColumnSpan="4" ItemsSource="{Binding MyList,Mode=TwoWay}" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Width="550" H... 1. MultiSelectComboBox.xaml <UserControl x:Class="MultiSelectComboBox.MultiSelectComboBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:...