Событие ComboBox - SelectionChanged имеет старое значение, а не новое значение - PullRequest
81 голосов
/ 02 июня 2010

C #, .NET 4.0, VS2010.

Новое в WPF. У меня есть ComboBox на моем MainWindow. Я подключил событие SelectionChanged указанного поля со списком. Однако, если я проверю значение поля со списком в обработчике событий, оно будет иметь старое значение. Это больше похоже на событие «SelectionChanging», чем событие SelectionChanged.

Как получить новое значение ComboBox после того, как выбор действительно произошел?

В настоящее время:

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

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

Обратите внимание, я получаю то же поведение, если использую объект, передаваемый в аргументах события, например e.OriginalSource.

Ответы [ 15 ]

0 голосов
/ 06 июля 2015

Если вам действительно нужно событие SelectionChanged, то лучшим ответом будет ответ SwDevMan81. Тем не менее, если вы начинаете с WPF, вам может потребоваться узнать, как все делать по-WPF, что отличается от прежних дней Windows Forms, которые использовались для таких событий, как SelectionChanged, с шаблоном WPF и Model View 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"); }
    }

}
0 голосов
/ 19 июня 2015

Я решил это с помощью события DropDownClosed, потому что оно срабатывает немного после изменения значения.

0 голосов
/ 01 июля 2014

Странно, что SelectedItem хранит свежие данные, а SelectedValue - нет. Похоже, ошибка для меня. Если ваши элементы в Combobox являются объектами, отличными от ComboBoxItems, вам потребуется что-то вроде этого: (мой ComboBox содержит KeyValuePair с)

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 может быть нулевым, тогда как Visual Studio постоянно говорит мне, что KeyValuePair не может быть нулевым. Вот почему я бросил SelectedItem в обнуляемый KeyValuePair<string, string>?. Затем я проверяю, имеет ли selectedItem значение, отличное от null. Этот подход должен быть применим к любому типу выбранного вами элемента.

0 голосов
/ 25 октября 2013

Это должно работать для вас ...

int myInt= ((data)(((object[])(e.AddedItems))[0])).kid;
0 голосов
/ 22 ноября 2010

Мне нужно было решить это в 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
...