MVVMで、ViewにあるListBoxのSelectionChangedイベントをViewModelで受け取るにはどうすれば良いであろうか? 少し整理をしてみた。以下のパターンがあるようだ。
1.ViewModelでViewのインスタンスを取得できるようにし、ViewModelにおいてListBoxのSelectionChangedイベントハンドラをコードで設定する。
ViewModelでViewのインスタンスを得る方法は以下を参考のこと。
MVVMでView内のコントロールをViewModelで参照したい
http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/ff497b52-f8f3-4c48-b4b4-f31edf56db22
2.ListBoxにICommandSourceを実装し、カスタムコントロールを作る。結果、コマンド を使用できるようになる。
(参考)
ListView.ItemActivated event in WPF
http://kentb.blogspot.com/2006/12/listviewitemactivated-event-in-wpf.html
3.SelectionChangedイベントではないですが、SelectedItemにViewModelのあるプロパティをバインドしておき、そのセッター内で必要な動作を記述する。
public class ViewModel : INotifyPropertyChanged
{
public ObservableCollection- Items { get; set; }
private Item _selectedItem = null;
public Item SelectedItem
{
get { return _selectedItem; }
set
{
if (selectedItem == value)
return;
_selectedItem = value;
OnPropertyChanged("SelectedItem");
//やりたいことを実行
}
}
・
・
・
}
4.Expression Blend3のdllであるMicrosoft.Expression.Interactivityを使用する方法
(参考)
MVVM invoking command on attached event
http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html
5.添付ビヘイビアを使用する。
(参考)
[WPF][C#]添付動作(AttachedBehavior)
http://blogs.wankuma.com/kazuki/archive/2009/05/05/172467.aspx
添付ビヘイビアでTextBoxにCommandを実装してみた
http://blog.sharplab.net/computer/cprograming/wpf/1862/
6.添付ビヘイビアの仕組みを拡張し、一つの添付ビヘイビアで複数のコマンドを実行できるようにする。
(参考)
WPF Commands Everywhere
http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/04/14/wpf-commands-everywhere.aspx
2はListBoxに限れば良いが、他のコントロールについても作らなければならず、ちょっと現実的ではない。4はBlend3のdllが要る。
そうすると、残るのは1、3、5、6。
コマンドを使いたいので1も落選。
残るは3、5、6。
最初に5、6を考える。5は一つの添付ビヘイビアで一つのコマンドしかセットできない。
6はその制限を外し、一つの添付ビヘイビアで複数のコマンド実行を可能にするように5の方法を拡張したもの。一つのコマンドしか実行しないケースでも6を使うように統一しておけば、あとで複数のコマンドを実行したい場合でもすんなり使うことができる。
よって、6を採用しておいた方が固いのではないかと思う。それにしても6は素晴らしい内容だと思う。ありがとうございます。
結論が出たところで3なのだが、この方法もシンプルで好きだ。ちょこっと試したい時には便利に使えると思う。