MVVMパターンを使用してWPFのComboBox
のSelectionChanged
イベントを発生させ/処理するにはどうすればよいですか?
詳細を説明してください。私はWPFを初めて使用しています。wpfでMVVMを使用してComboBoxのSelectionChangedイベントを処理する方法は?
私が欲しいのは、ComboBox
アイテムの選択が変更されたときにいくつかの操作を行うことです。どのようにMVVMの方法でそれを達成できますか?
MVVMパターンを使用してWPFのComboBox
のSelectionChanged
イベントを発生させ/処理するにはどうすればよいですか?
詳細を説明してください。私はWPFを初めて使用しています。wpfでMVVMを使用してComboBoxのSelectionChangedイベントを処理する方法は?
私が欲しいのは、ComboBox
アイテムの選択が変更されたときにいくつかの操作を行うことです。どのようにMVVMの方法でそれを達成できますか?
MVVMソリューション:
バインドあなたのViewModelのプロパティにComboBox
のItemsSource
とSelectedItem
プロパティ: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
}
まず、物事を明確にしましょう。あなたが購読するのではなく、予定を変更することはできません。
選択の変更を処理する場所に関する情報を提供していないため、基本となるViewModelで最も一般的なシナリオ処理を想定します。 MVVMによると、ViewModelはViewについて何も知ってはいけないので、ViewModelから直接Viewのコントロールのイベントにサブスクライブすることはできません。しかし、ViewModelのプロパティをSelectedItem
またはSelectedIndex
のいずれかにバインドすることができます。そのため、選択が変更されたときにトリガされます。
<ComboBox
SelectedIndex="{Binding SelectedIndexPropertyName}"
... />
view.DataContext
経由のViewModelにアクセスすることにより、ビューの後ろにコードの取り扱いが、私は、このような練習を避けることをお勧めをしている他のソリューションがありますが、これは例の周りの仕事です。
あなたの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}"/>
これは良い習慣ですが、問題の解決には役立ちません。 @Tanyaは、ユーザーがUIから選択を変更したときに、それに応じていくつかの操作を行うために、ビューモデルのコードを通知することを望んでいました。 Notifyプロパティの変更は、その逆を行うために使用されます。 – Bishoy
私はこの方法の大ファンです。
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>
私はこれを試しましたが、選択変更イベントをトリガーしませんでした。 – Tanya
これはどのようにチェックしましたか?この場合、コントロールイベントを購読するべきではありません。 – sll
イベントをトリガーすることは想定されていません。これは、MySelectedItemが値を変更したときにロジックが発生するためです。代わりにそれを使用したい場合、私はイベントハンドラで私の答えを更新しました。 – snurre