在C# WPF中从组合框获取所选值

81

我刚刚开始使用WPF表单,而不是Windows Forms表单。 在Windows Forms表单中,我只需要执行以下操作:

ComboBox.SelectedValue.toString();

这在其他技术栈中是可行的,但在WPF中该怎么做呢?它似乎没有这个选项。


1
尝试使用SelectedItem。你为什么要将变量名命名为ComboBox?! - The Smallest
我实际上没有使用ComboBox作为变量名。我应该更清楚地表明组合框实际上是cboType,所以我正在使用cboType.SelectedValue.toString()。我尝试过selectedItem,但它不仅给我值,还显示System.Windows.Controls.ComboBoxItem:Software。Software是值名称,我只想要该值,而不是前面的其余部分。感谢您的帮助。 - Boardy
我将“WF”解释为“Windows Forms”,而不是“Windows Workflow Foundation”。哪个是正确的?(请通过编辑您的问题进行回复,而不是在此处评论。) - Peter Mortensen
@PeterMortensen 我不确定你的意思,问题中始终提到的是WPF,而不是WF。 - Boardy
26个回答

101

我找到了一种有些奇怪的方法来完成它,与旧的WF表单相比:

ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;
string value = typeItem.Content.ToString();

5
这一行:'ComboBoxItem typeItem = (ComboBoxItem)cboType.SelectedItem;' 对我来说会导致错误...非常奇怪。 - Guy Cohen
@GuyCohen应该是ComboBox而不是ComboBoxItem。 - imGreg
@Tariq 你最好发一个新问题,因为需要看代码才能真正帮助你。但是看起来你正在尝试从DataGrid而不是ComboBox中获取值。 - Boardy
字符串文本 = ((ComboBoxItem)comboBox.SelectedItem).Content.ToString(); - Helio Passarelli
这个解决方案只在某些情况下适用。由于某种原因,我不得不执行以下操作:string Name = NameList.SelectedItem is ComboBoxItem typeItem ? typeItem.Content.ToString() : NameList.SelectedItem.ToString(); - Rick Papo

94

嗯..我找到了一个更简单的解决方案。

String s = comboBox1.Text;

这样我就可以将选定的值作为字符串获取。


25
我在SelectionChanged事件处理程序中尝试了这个,但文本仍然设置为旧值而不是新选择的项 :( 我将使用Boardy的答案。 - Ben
11
这并不起作用,至少在WPF动态添加项目时不起作用。我不理解为什么会有这么多赞。((ComboBoxItem)comboBox1.SelectedItem).Content.ToString(); 应该是正确的代码。 - Bibaswann Bandyopadhyay
2
如果在“SelectionChanged”等其他情况下使用此答案可能会引起问题。在我看来,“(MyCombobox.SelectedItem as ComboBoxItem).Content.ToString()”是更好的解决方案。 - Travis Tubbs
2
它对我不起作用。我动态地添加了组合框项目。谢谢 - MindRoasterMir
1
comboBox1.Text将显示上次选择的值。在Selection_Changed事件中,当选择新值时,上述代码仍将返回旧值。 - sandyiit
显示剩余2条评论

15

我的 XAML 如下所示:

<ComboBox Grid.Row="2" Grid.Column="1" Height="25" Width="200" SelectedIndex="0" Name="cmbDeviceDefinitionId">
    <ComboBoxItem Content="United States" Name="US"></ComboBoxItem>
    <ComboBoxItem Content="European Union" Name="EU"></ComboBoxItem>
    <ComboBoxItem Content="Asia Pacific" Name="AP"></ComboBoxItem>
</ComboBox>

这段内容展示了WPF组合框的名称以及其文本内容。要获取所选项的名称,我需要按照以下代码行:

ComboBoxItem ComboItem = (ComboBoxItem)cmbDeviceDefinitionId.SelectedItem;
string name = ComboItem.Name;

获取 WPF 组合框的所选文本:

string name = cmbDeviceDefinitionId.SelectionBoxItem.ToString();

11

请确保您在 XAML 文件中设置了 ComboBox 的名称:

<ComboBox Height="23" Name="comboBox" />

在你的代码中,可以使用SelectedItem属性访问所选项目:

MessageBox.Show(comboBox.SelectedItem.ToString());

1
我已经尝试了一些方法,虽然有点起作用,但不像旧的WF表单那样。在旧的WF表单中,它只会给出所选的值,但现在它印出:System.Windows.Controls.ComboBoxItem: Software。如何像以前一样只获取值而不打印System.Windows.Controls.ComboBoxItem。谢谢您的帮助。 - Boardy
好的解决方案,简单而有效!! - Clint

7

这要看你绑定到ComboBox的是什么。如果你绑定了一个名为MyObject的对象,并且有一个属性叫做Name,那么请按照以下步骤进行操作:

MyObject mo = myListBox.SelectedItem as MyObject;
return mo.Name;

7
这些怎么样:

如何评价这些:

string yourstringname = (yourComboBox.SelectedItem as ComboBoxItem).Content.ToString();

这和 ComboBox.SelectionBoxItemStringFormat 有什么区别? - chriszo111
当您将其用作非空时,为什么要使用“as”而不是强制转换? - Paul Childs

6
作为在ComboBox中的一个变体,SelectionChanged事件处理程序:
private void ComboBoxName_SelectionChanged(object send ...
{
    string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}

完美,适用于我测试的所有解决方案。 - Spinstaz

4

我曾经遇到了类似的问题,在尝试本主题中建议的多个解决方案后发现,当ComboBox项目实际更新以显示新选择时(即总是在更改发生之前),SelectionChanged事件就已经触发了,因此它总是给出更改发生之前组合框的内容。

为了解决这个问题,我发现最好使用自动传递给事件处理程序的e参数,而不是直接从组合框加载值。

XAML:

<Window.Resources>
    <x:Array x:Key="Combo" Type="sys:String">
        <sys:String>Item 1</sys:String>
        <sys:String>Item 2</sys:String>
    </x:Array>
</Window.Resources>
<Grid>
    <ComboBox Name="myCombo" ItemsSource="{StaticResource Combo}" SelectionChanged="ComboBox_SelectionChanged" />
    <TextBlock Name="MyTextBlock"></TextBlock>
</Grid>

C#:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string chosenValue = e.AddedItems[0].ToString();
}

这应该被视为一个有用的答案! - Ali Safari

3
解决这个问题很简单。我所做的就是在我的XAML代码中添加“SelectedValuePath”,并将其绑定到我想要使用combobox返回的模型属性上。
<ComboBox SelectedValuePath="_Department"
          DisplayMemberPath="_Department"
          Height="23"
          HorizontalAlignment="Left"
          ItemsSource="{Binding}"
          Margin="-58,1,0,5"
          Name="_DepartmentComboBox"
          VerticalAlignment="Center"
          Width="268"/>

2
创建一个ComboBox的SelectionChanged事件,并在WPF设计中设置ItemsSource="{Binding}":
代码:
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string ob = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
    MessageBox.Show(ob);
}

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