2011-12-29 45 views
21

MVVMパターンを使用してWPFのComboBoxSelectionChangedイベントを発生させ/処理するにはどうすればよいですか?
詳細を説明してください。私はWPFを初めて使用しています。wpfでMVVMを使用してComboBoxのSelectionChangedイベントを処理する方法は?

私が欲しいのは、ComboBoxアイテムの選択が変更されたときにいくつかの操作を行うことです。どのようにMVVMの方法でそれを達成できますか?

答えて

35

MVVMソリューション

バインドあなたのViewModelのプロパティにComboBoxItemsSourceSelectedItemプロパティ:MainViewModel.csで

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

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 
} 
+1

私はこれを試しましたが、選択変更イベントをトリガーしませんでした。 – Tanya

+1

これはどのようにチェックしましたか?この場合、コントロールイベントを購読するべきではありません。 – sll

+0

イベントをトリガーすることは想定されていません。これは、MySelectedItemが値を変更したときにロジックが発生するためです。代わりにそれを使用したい場合、私はイベントハンドラで私の答えを更新しました。 – snurre

1

まず、物事を明確にしましょう。あなたが購読するのではなく、予定を変更することはできません。

選択の変更を処理する場所に関する情報を提供していないため、基本となるViewModelで最も一般的なシナリオ処理を想定します。 MVVMによると、ViewModelはViewについて何も知ってはいけないので、ViewModelから直接Viewのコントロールのイベントにサブスクライブすることはできません。しかし、ViewModelのプロパティをSelectedItemまたはSelectedIndexのいずれかにバインドすることができます。そのため、選択が変更されたときにトリガされます。

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

view.DataContext経由のViewModelにアクセスすることにより、ビューの後ろにコードの取り扱いが、私は、このような練習を避けることをお勧めをしている他のソリューションがありますが、これは例の周りの仕事です。

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は、ユーザーがUIから選択を変更したときに、それに応じていくつかの操作を行うために、ビューモデルのコードを通知することを望んでいました。 Notifyプロパティの変更は、その逆を行うために使用されます。 – 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> 
関連する問題