2011-12-29 6 views
21

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

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

ответ

35

решение 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; 
    } 
} 

code- за решением:

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

<ComboBox SelectionChanged="ComboBox_SelectionChanged" /> 

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

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

Я пробовал это, но не вызывал событие с измененным выбором. – Tanya

+1

Как вы это проверили? Вы не должны подписываться на контрольное событие в этом случае – sll

+0

Не предполагается инициировать событие, так как логика возникает, когда вместо параметра MySelectedItem изменяется значение. Я обновил свой ответ обработчиком событий, если вы хотите использовать его вместо этого. – snurre

1

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

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

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

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

5

Ваш 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}"/> 
+0

Хотя это хорошая практика, это не помогает решить проблему. @Tanya хотела, чтобы ее код в модели представления был уведомлен, когда пользователь меняет выбор из пользовательского интерфейса, чтобы выполнить некоторые операции соответственно. Уведомление об изменении свойства используется для противоположного этому. – Bishoy

1

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

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> 
Смежные вопросы