从 C # WPF 的组合框中获取选定值

我刚开始使用 WPF 表单而不是 Windows 表单。在 Windows 窗体中,我可以这样做:

ComboBox.SelectedValue.toString();

And this would work fine.

How do I do this in WPF? It doesn't seem to have the option.

403695 次浏览

这取决于您绑定到 ComboBox 的内容。如果您已经绑定了一个名为 MyObject 的对象,并且有一个名为 Name 的属性,请执行以下操作:

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

原理是一样的。

You can either use SelectedIndex and use ComboBox.Items[SelectedIndex].ToString(). Or just ComboBox.SelectedItem and cast it to any type you need :)

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

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

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

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

与旧的 WF 形式相比,我发现了一种有点奇怪的方式:

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

我找到了一个更简单的解决办法。

String s = comboBox1.Text;

通过这种方式,我得到了字符串形式的选定值。

解决这个问题很简单。我所做的只是将“ SelectedValuePath”添加到我的 XAML 代码中,并将其绑定到我希望用 combobox 返回的 model 属性。

<ComboBox SelectedValuePath="_Department"
DisplayMemberPath="_Department"
Height="23"
HorizontalAlignment="Left"
ItemsSource="{Binding}"
Margin="-58,1,0,5"
Name="_DepartmentComboBox"
VerticalAlignment="Center"
Width="268"/>

XAML:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="19,123,0,0" Name="comboBox1" VerticalAlignment="Top" Width="33" ItemsSource="{Binding}" AllowDrop="True" AlternationCount="1">
<ComboBoxItem Content="1" Name="ComboBoxItem1" />
<ComboBoxItem Content="2" Name="ComboBoxItem2" />
<ComboBoxItem Content="3" Name="ComboBoxItem3" />
</ComboBox>

C # :

if (ComboBoxItem1.IsSelected)
{
// Your code
}
else if (ComboBoxItem2.IsSelected)
{
// Your code
}
else if(ComboBoxItem3.IsSelected)
{
// Your code
}
MsgBox(cmbCut.SelectedValue().ToString())

创建 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);
}

我的 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();

这些怎么样:

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

我也遇到过类似的问题,并且尝试了这个帖子中建议的一些解决方案,但是发现在组合框项目实际更新以显示新的选择之前,SelectionChanged Event 就已经触发了(也就是说,它总是在更改发生之前给出组合框的内容)。

为了克服这个问题,我发现最好使用自动传递给事件处理程序的 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();
}
private void usuarioBox_TextChanged(object sender, EventArgs e)
{
string textComboBox = usuarioBox.Text;
}

作为 ComboBox SelectionChanged事件处理程序中的变体:

private void ComboBoxName_SelectionChanged(object send ...
{
string s = ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();
}

要在 C # 中获取 ComboBox 所选索引的值,请使用:

Combobox.SelectedValue

事实上,你也可以按照下面的方法来做。

假设您的 ComboBox 名称是 comboBoxA,那么它的值可以是:

string combo = comboBoxA.SelectedValue.ToString();

我认为现在已经证实了,因为你的问题是五年前的。

这在很大程度上取决于盒子是如何被填满的。如果是通过将 DataTable(或其他集合)附加到 ItemsSource来完成的,您可能会发现在 XAML 中将 SelectionChanged事件处理程序附加到您的框中,然后在代码隐藏中使用这种方法非常有用:

private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cbx = (ComboBox)sender;
string s = ((DataRowView)cbx.Items.GetItemAt(cbx.SelectedIndex)).Row.ItemArray[0].ToString();
}

I saw 2 other answers on here that had different parts of that - one had ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();, which looks similar but doesn't cast the box to a DataRowView, something I found I needed to do, and another: ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();, used .SelectedItem instead of .Items.GetItemAt(comboBox1.SelectedIndex). That might've worked, but what I settled on was actually the combination of the two I wrote above, and don't remember why I avoided .SelectedItem except that it must not have worked for me in this scenario.

如果要动态填充框,或者直接在 XAML 中使用下拉列表中的 ComboBoxItem项,我使用的代码如下:

private void ComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cbx = (ComboBox)sender;
string val = String.Empty;
if (cbx.SelectedValue == null)
val = cbx.SelectionBoxItem.ToString();
else
val = cboParser(cbx.SelectedValue.ToString());
}

你会看到我有 cboParser。这是因为 SelectedValue的输出如下所示: System.Windows.Controls.Control: Some Value。至少在我的项目中是这样的。所以你必须从中解析出你的 Some Value:

private static string cboParser(string controlString)
{
if (controlString.Contains(':'))
{
controlString = controlString.Split(':')[1].TrimStart(' ');
}
return controlString;
}

但这就是为什么这一页上有这么多答案。这在很大程度上取决于你如何填补这个盒子,至于你如何才能得到它的价值回来。答案可能在一种情况下是正确的,在另一种情况下是错误的。

这样写:

String CmbTitle = (cmb.SelectedItem as ComboBoxItem).Content.ToString()

这对我很有用:

System.Data.DataRowView typeItem = (System.Data.DataRowView)ComboBoxName.SelectedItem;
string value = typeItem.DataView.ToTable("a").Rows[0][0].ToString();

我用这个代码,它为我工作:

DataRowView typeItem = (DataRowView)myComboBox.SelectedItem;
string value = typeItem.Row[0].ToString();

如果你想得到值并验证它,你可以这样做

string index = ComboBoxDB.Text;
if (index.Equals(""))
{
MessageBox.Show("your message");
}
else
{
openFileDialog1.ShowDialog();
string file = openFileDialog1.FileName;
reader = new StreamReader(File.OpenRead(file));
}
        // -----------------------------------------------------------------


private void onSelectionChanged(object sender,
SelectionChangedEventArgs e)
{
String result = ((ComboBox)sender).SelectedItem.ToString();
// do something with result
}


// -----------------------------------------------------------------

我发现这个很有用。我把它放在这里,以防有人需要它:

为了得到价值:

(comboBox1.SelectedItem as dynamic).Value

得到短信:

(comboBox1.SelectedItem as dynamic).Text
<ComboBox x:Name="TestComboBox" SelectionChanged="TestComboBox_SelectionChanged" Padding="2">
<ComboBoxItem>Item 1</ComboBoxItem>
<ComboBoxItem>Item 2</ComboBoxItem>
</ComboBox>

方法1

string content = (((sender as ComboBox).SelectedValue) as ComboBoxItem).Content.ToString();

方法2

string content = (string)((ComboBoxItem)((ComboBox)sender).SelectedValue).Content;

对我来说,一个简单的解决办法是:

string name = (string)combobox.SelectedItem

您可以通过属性 SelectedValue提取这些值,如下所示:

combo.SelectedValue.ToString();