Подтвердить что ты не робот

Как обрабатывать событие SelectionChanged для ComboBox с MVVM в wpf?

Как повысить/обработать событие SelectionChanged WPF ComboBox с использованием шаблона MVVM?
Объясните подробно, пожалуйста, я новичок в WPF.

Что я хочу, это сделать некоторые операции, когда выбор элемента ComboBox изменился. Как я могу достичь этого, используя MVVM?

4b9b3361

Ответ 1

Решение MVVM:

Привяжите свойства ItemsSource и SelectedItem свойств ComboBox к свойствам в ViewModel:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/>

В MainViewModel.cs:

public ObservableCollection<string> MyItems { get; set; }

private string _mySelectedItem;
public string MySelectedItem
{
  get { return _mySelectedItem; }
  set
  {
    // Some logic here
    _mySelectedItem = value;
  }
}

Решение для кода:

Если вы не хотите использовать MVVM, вы можете добавить это:

 <ComboBox SelectionChanged="ComboBox_SelectionChanged" />

И добавьте это в MainWindow.xaml.cs:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Some logic here
}

Ответ 2

В вашей модели ViewModel необходимо реализовать INotifyPropertyChanged.

public class MyViewModel : INotifyPropertyChanged
{
    private string _mySelectedItem;
    public string MySelectedItem
    {
        get
        {
            return _mySelectedItem;
        }
        set
        {
            if (_mySelectedItem != value)
            {
                _mySelectedItem = value;
                // Perform any pre-notification process here.
                if (null != PropertyChanged)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("MySelectedItem"));
                }
            }
        }
    } 
}

Ранее опубликованный XAML верен:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 

Ответ 3

Как сначала дайте понять, вы не можете изменить событие, а можете подписаться на него.

Поскольку вы не указали какую-либо информацию о том, откуда вы хотите обрабатывать изменения выбора, я рассмотрю наиболее распространенный сценарий - обработку в базовом ViewModel. Согласно MVVM ViewModel не должен ничего знать о View, поэтому вы не можете подписаться непосредственно с ViewModel на событие управления View. Но вы можете привязать свойство ViewModel к SelectedItem или SelectedIndex, чтобы оно срабатывало при изменении выбора.

<ComboBox 
       SelectedIndex="{Binding SelectedIndexPropertyName}" 
       ... />

Существуют другие решения, выполняющие обработку кода, стоящего за View, обращаясь к ViewModel через view.DataContext, но я бы посоветовал избежать такой практики, это работа вокруг случаев.

Ответ 4

Я большой поклонник этого метода.

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

<ComboBox Grid.Column="2"  DisplayMemberPath="Data.name" ItemsSource="{Binding Model.Regions}" SelectedItem="{Binding Model.SelectedRegion}">
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding RegionChangedCmd}" />
    </i:EventTrigger>
</ComboBox>