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

时间:2010-06-02 19:53:10

标签: 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;
}

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

17 个答案:

答案 0 :(得分:95)

根据MSDN,e.AddedItems

  

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

所以你可以使用:

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

如果您对SelectedItem中的string使用Items值,也可以使用sender

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;
}

由于ContentSelectedItem都是对象,因此更安全的方法是使用.ToString()代替as string

答案 1 :(得分:47)

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

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

  1. 文本部分:此部分中的值对应于ComboBox的文本属性。
  2. 选择器部件(即“下拉”部分):此部分中的所选项目对应于 SelectedItem 属性。
  3. Expanded ComboBox Parts

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

    点击下拉列表中的项目后, SelectedItem 的值会更改,并且会引发 SelectionChanged 事件。 文字属性尚未更新,因为 SelectionChanged 之后文字部分才会更新>处理程序完成。这可以通过在处理程序中放置一个断点并查看控件来观察:

    ComboBox at breakpoint in SelectionChanged handler

    由于此时尚未更新文字部分文字属性会返回之前选择的值。

答案 2 :(得分:45)

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

private void comboBox_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(comboBox.Text) 
}

真的很简单。

答案 3 :(得分:10)

这对我有用:

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

答案 4 :(得分:4)

这对我有用:

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

答案 5 :(得分:2)

对于ComboBox中文本的任何更改(当更改所选索引以及通过编辑更改文本时)会触发以下事件。

<ComboBox IsEditable="True" TextBoxBase.TextChanged="cbx_TextChanged" />

答案 6 :(得分:1)

第二个选项对我不起作用,因为.Text元素超出了范围(C#4.0 VS2008)。这是我的解决方案......

string test = null;
foreach (ComboBoxItem item in e.AddedItems)
{
   test = item.Content.ToString();
   break;
}

答案 7 :(得分:1)

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string newItem = ((DataRowView) e.AddedItems[0]).Row.ItemArray[0].ToString();
}

答案 8 :(得分:0)

从组合框的SelectionChanged事件中,您可以获取选定的项目文本,如下所示:

android_mvvm

答案 9 :(得分:0)

您可以在Combobox控件的SelectionChanged事件中检查SelectedIndex或SelectedValue或SelectedItem属性。

答案 10 :(得分:0)

不要无缘无故地使事情复杂化。使用SelectedValue属性,您可以轻松地获得一个选定的ComboBox值,如下所示:YourComboBoxName.SelectedValue.ToString()。

在幕后,SelectedValue属性定义为:SelectedValue {get; set;},这意味着您可以使用它来获取或设置ComboBox的值。

使用SelectedItem并不是获得ComboBox值的有效方法,因为它需要很多分支。

答案 11 :(得分:0)

@WebServlet("/HelloWorldServlet")

使用private void indBoxProject_SelectionChanged(object sender, SelectionChangedEventArgs e) { int NewProjID = (e.AddedItems[0] as kProject).ProjectID; this.MyProject = new kProject(NewProjID); LoadWorkPhase(); } 其中kProject是一个保存数据的类,因为它在我明确区分之前默认为RemovedItems [0]。感谢SwDevMan81为我提供了回答这个问题的初始信息。

答案 12 :(得分:0)

如果您真的需要SelectionChanged事件,那么最佳答案是SwDevMan81的答案。但是,如果您从WPF开始,那么您可能希望了解如何以WPF方式执行操作,这与以前依赖于SelectionChanged等事件的旧Windows窗体日期不同,具有WPF和模型视图ViewModel模式,你应该使用绑定。这是一个代码示例:

// In the Views folder: /Views/MyWindow.xaml:
// ...
<ComboBox ItemsSource="{Binding MyViewModel.MyProperties, RelativeSource={RelativeSource AncestorType=Window}}"
         SelectedItem="{Binding MyViewModel.MyProperty  , RelativeSource={RelativeSource AncestorType=Window}}" />
// ...



// In the Views folder: /Views/MyWindow.xaml.cs:
public partial class MyWindow : Window
{
    public  MyViewModelClass MyViewModel {
        get { return _viewModel; }
        private set { _viewModel = value;}
    }

    public MyWindow()
    {
        MyViewModel.PropertyChanged += MyViewModel_PropertyChanged;

    }

    void MyViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
        {
            // Do Work
            // Put your logic here!
        }
    }
}

using System.ComponentModel;

// In your ViewModel folder: /ViewModels/MyViewModelClass.cs:
public class MyViewModelClass : INotifyPropertyChanged
{
    // INotifyPropertyChanged implementation:
    private void NotifyPropertyChanged(string propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
    public event PropertyChangedEventHandler PropertyChanged;

    // Selected option:
    private string _myProperty;
    public  string  MyProperty {
        get { return _myProperty; }
        set { _myProperty = value; NotifyPropertyChanged("MyProperty"); }
    }

    // Available options:
    private List<string> _myProperties;
    public  List<string>  MyProperties {
        get { return _myProperties; }
        set { _myProperties = value; NotifyPropertyChanged("MyProperties"); }
    }

}

答案 13 :(得分:0)

SelectedItem保存新数据很奇怪,而SelectedValue则不然。对我来说听起来像个错误。如果您在Combobox中的项目是ComboBoxItems以外的对象,则需要以下内容:(我的ComboBox包含KeyValuePair s)

var selectedItem = (KeyValuePair<string, string>?)(sender as ComboBox).SelectedItem;
if (!selectedItem.HasValue)
    return;

string selectedValue = selectedItem.Value.Value;  // first .Value gets ref to KVPair

ComboBox.SelectedItem可以为null,而Visual Studio会告诉我KeyValuePair不能为空。这就是为什么我将SelectedItem投射到可以为空的KeyValuePair<string, string>?的原因。然后,我会检查selectedItem是否包含null以外的值。此方法应适用于所选项目的实际类型。

答案 14 :(得分:0)

我需要在VB.NET中解决这个问题。这就是我所得到的似乎有用的东西:

Private Sub ComboBox1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ComboBox_AllSites.SelectionChanged
   Dim cr As System.Windows.Controls.ComboBoxItem = ComboBox1.SelectedValue
   Dim currentText = cr.Content
   MessageBox.Show(currentText)
End Sub

答案 15 :(得分:-2)

这对你有用......

int myInt= ((data)(((object[])(e.AddedItems))[0])).kid;

答案 16 :(得分:-3)

我通过使用DropDownClosed事件解决了这个问题,因为在更改值后会稍微触发。

相关问题