RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

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!");
                }));
        }
    }
}

実行するとこんな感じです。

f:id:ys-soniclab:20160903213348p:plain