ComboBox- SelectionChanged事件有旧值,而不是新值。
ComboBox- SelectionChanged事件有旧值,而不是新值。
C#, .NET 4.0, VS2010. 对WPF不熟悉。我的MainWindow上有一个ComboBox。我将该ComboBox的SelectionChanged事件与事件处理程序关联起来。然而,在事件处理程序中检查ComboBox的值时,它仍然是旧值。这更像是一个\"SelectionChanging\"事件,而不是SelectionChanged事件。如何在选择实际发生后获取ComboBox的新值?\n目前的代码如下:\n
this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged); ... private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e) { string text = this.MyComboBox.Text; }
\n注意,如果我使用事件参数中传递的对象,例如e.OriginalSource,我会得到相同的行为。
问题出现的原因是在ComboBox的SelectionChanged事件中,获取到的是旧的值而不是新的值。解决方法是使用DropDownClosed事件来获取ComboBox的当前值。以下是解决方法的代码示例:
private void comboBox_DropDownClosed(object sender, EventArgs e) { MessageBox.Show(comboBox.Text); }
这个方法非常简单。如果你想要获取ComboBox的当前值,使用DropDownClosed事件就可以了。但是需要注意的是,当使用键盘进行选择时,这个事件可能不会触发。
有些新手程序员可能会对此感到困惑。但是这个方法对我来说起作用了。有趣的是,当选择发生变化时,不能轻松地获取到选中的值。我相信这一定有一个很好的原因,但是,哎呀。
以上就是解决ComboBox的SelectionChanged事件获取旧值而不是新值的问题的原因和解决方法。
问题原因:ComboBox的SelectionChanged事件在事件处理程序中访问的Text属性是旧值,而不是新值。这是因为SelectionChanged事件在选择项更改之前触发,而Text属性在事件处理程序执行完成后才会更新。
解决方法:在事件处理程序中使用SelectedItem属性来获取正确的值,而不是使用Text属性。
ComboBox是一个复合控件,由两个部分组成:
1. 文本部分:该部分的值对应于ComboBox的Text属性。
2. 选择器部分(即“下拉”部分):该部分的选定项对应于SelectedItem属性。
当在下拉部分中点击一个项时,SelectedItem的值会发生变化,并引发SelectionChanged事件。然而,Text属性在事件处理程序执行完成之前并没有更新,因为文本部分的更新是在SelectionChanged处理程序之后才会发生。
因此,在事件处理程序中访问Text属性会返回先前选择的值,而不是新选择的值。为了获取正确的值,应该使用SelectedItem属性。
这个问题的解决方法是在SelectionChanged事件处理程序中使用SelectedItem属性来获取新值。
ComboBox- SelectionChanged事件具有旧值,而不是新值的问题可能是由于事件的命名误导造成的。当我们看到SelectionChanged事件时,我们期望对象的状态已经发生了改变。然而,实际上,SelectionChanged事件中的参数e.AddedItems包含的是选中的项,而不是新选中的项。因此,在事件处理程序中,我们需要使用其他方法来获取新选中的值。
根据MSDN的说明,我们可以使用e.AddedItems来获取选中的项。因此,我们可以使用以下代码来获取新选中的值:
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = (e.AddedItems[0] as ComboBoxItem).Content as string;
}
另外,我们还可以使用SelectedItem属性来获取新选中的值。如果ComboBox的Items使用的是string类型的值,我们可以使用以下代码来获取新选中的值:
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = (sender as ComboBox).SelectedItem as string;
}
或者
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}
由于Content和SelectedItem都是对象,为了安全起见,我们可以使用.ToString()方法来获取值,而不是使用as string:
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = (e.AddedItems[0] as ComboBoxItem).Content.ToString();
}
总结一下,ComboBox- SelectionChanged事件的参数e.AddedItems包含的是选中的项,而不是新选中的项。为了获取新选中的值,我们可以使用SelectedItem属性或者通过SelectedValue属性来获取。使用SelectedItem属性需要注意将对象转换为正确的类型,而使用SelectedValue属性可以直接获取选中的值。