MVVM:とにかく適当なICommandを実装したい時のサンプル
サンプルプログラム作成時、INotifyPropertyChangedを手書きで実装したViewModelは作ったけれど、
「ICommandも実装しなきゃいけないの忘れてた!今からnugetでMVVM用ライブラリ落としてくるのも面倒くさいし…」
みたいな時の為の、しょうもないサンプルです。
public class RelayCommand : ICommand { //Command実行時に実行するアクション、引数を受け取りたい場合はこのActionをAction<object>などにする private Action _action; public RelayCommand(Action action) {//コンストラクタでActionを登録 _action = action; } #region ICommandインターフェースの必須実装 public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) {//とりあえずActionがあれば実行可能 return _action != null; } public void Execute(object parameter) {//今回は引数を使わずActionを実行 _action?.Invoke(); } #endregion }
私個人は上記実装を非常によく使います。
こんな感じで利用してください。
View
<Window x:Class="WpfApplication.MainWindow" … > <Window.DataContext> <local:ViewModel/> </Window.DataContext> <Grid> <Button Content="Test" Command="{Binding MyCommand}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </Window>
ViewModel
public class ViewModel : INotifyPropertyChanged { … private RelayCommand _myCommand; /// <summary> /// Gets the MyCommand. /// </summary> public RelayCommand MyCommand { get { return _myCommand ?? (_myCommand = new RelayCommand( () => { MessageBox.Show("clicked!"); })); } } }
実行するとこんな感じです。