ComboBox- SelectionChanged事件具有旧值,而不是新值

Mat*_*att 83 c# wpf combobox .net-4.0 selectionchanged

C#,.NET 4.0,VS2010.

WPF新手.我的MainWindow上有一个ComboBox.我挂钩了所说组合框的SelectionChanged事件.但是,如果我检查事件处理程序中组合框的值,它具有旧值.这听起来更像是一个"SelectionChanging"事件,而不是SelectionChanged事件.

如何在选择实际发生后获取ComboBox的新值?

目前:

this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);

...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = this.MyComboBox.Text;
}
Run Code Online (Sandbox Code Playgroud)

注意,如果我使用在事件args,egeOriginalSource中传递的对象,我会得到相同的行为.

SwD*_*n81 98

根据MSDN, e.AddedItems:

获取包含所选项目的列表.

所以你可以使用:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (e.AddedItems[0] as ComboBoxItem).Content as string;
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用SelectedItem,如果你使用string值的Items来自sender:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (sender as ComboBox).SelectedItem as string;
}
Run Code Online (Sandbox Code Playgroud)

要么

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}
Run Code Online (Sandbox Code Playgroud)

由于这两个ContentSelectedItem是对象,一个更安全的做法是使用.ToString()替代as string

  • 有趣......它具有新的价值.而且RemovedItems有旧的.如果用词不当,那个事件名称有点用,至少恕我直言.当我看到SelectionChanged时,我希望对象的状态已经改变了.我可以看到这给了我们更多的信息. (11认同)
  • `ComboBox.SelectedItem`没有一个名为`Text`的属性,但你可以把`ComboBox.SelectedItem作为字符串`(虽然这可能只适用于'items`用于`Items` - 没有测试任何其他东西) (3认同)
  • 只是 string text = (string)e.AddedItems[0]; (2认同)
  • 希望我可以放弃 2 个 ups,你的回答在 2 个不同的场合帮助了我两次 (2认同)

Dav*_*der 53

要在此处检查的正确值是SelectedItem属性.

ComboBox是一个复合控件,其两个部分是:

  1. 文本部分:此部分中的值对应于ComboBox 的Text属性.
  2. 选择器部件(即"下拉"部件):此部件中的选定项对应于SelectedItem属性.

扩展的ComboBox零件

在扩展ComboBox之后(即在选择新值之前)立即拍摄上面的图像.此时,TextSelectedItem都是"Info",假设ComboBox项是字符串.如果ComboBox项是Enum的所有值,称为"LogLevel",则SelectedItem当前为LogLevel.Info.

单击下拉列表中的项目时,将更改SelectedItem的值并引发SelectionChanged事件.但是,Text属性尚未更新,因为在SelectionChanged处理程序完成之后,文本部件才会更新.这可以通过在处理程序中放置断点并查看控件来观察:

在SelectionChanged处理程序中的断点处的ComboBox

由于此时尚未更新文本部分,因此Text属性返回先前选择的值.

  • 完全扩展,它有助于实现我的Binding位于Text属性上,而不是正确的SelectedItem。 (2认同)
  • @DaveKidder 很好的例子!+1 (2认同)

hid*_*den 46

如果您想要组合框的当前值,请使用DropDownClosed事件而不是selectionChanged.

private void comboBox_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(comboBox.Text) 
}
Run Code Online (Sandbox Code Playgroud)

真的那么简单.

  • @jvelez我认为使用键盘时不会触发. (10认同)

小智 10

这对我有用:

private void AppName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ComboBoxItem cbi = (ComboBoxItem)AppName.SelectedItem;
   string selectedText = cbi.Content.ToString();
}
Run Code Online (Sandbox Code Playgroud)


Бра*_*јић 6

这为我工作:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    var text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;            
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ník 5

Following event is fired for any change of the text in the ComboBox (when the selected index is changed and when the text is changed by editing too).

<ComboBox IsEditable="True" TextBoxBase.TextChanged="cbx_TextChanged" />
Run Code Online (Sandbox Code Playgroud)