这在很大程度上取决于盒子的填充方式。如果通过将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();
}
我在这里看到了 2 个其他答案,其中有不同的部分 - 一个有 ComboBoxName.Items.GetItemAt(ComboBoxName.SelectedIndex).ToString();,看起来很相似,但没有将框转换为 DataRowView,这是我发现我需要做的事情,另一个: ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();,使用 .SelectedItem 而不是 .Items.GetItemAt(comboBox1.SelectedIndex)。这可能行得通,但我确定的实际上是我上面写的两者的组合,并且不记得我为什么避免 .SelectedItem 除非它在这种情况下对我不起作用。
如果您是动态填充框,或者直接在 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;
}
但这就是为什么这个页面上有这么多答案。这在很大程度上取决于您如何填充盒子,以及如何从中获得价值。答案可能在一种情况下是正确的,而在另一种情况下可能是错误的。