Galileo Figaro

常に初陣!

WPF ブートキャンプ: Chapter 2: Command

力試し

簡単なプログラムを作成してみます。 まずは自力でチャレンジしてみましょう。

起動すると、下記のような画面が現れ、

ボタンを押すと、下記のようなダイアログを 表示するプログラムを作成しましょう。

コマンドの概要

コマンドは、System.Windows.Input.ICommand インターフェイスを 実装したクラスです。 ICommand インターフェイスには、下記のメンバが存在します。役割は下記のとおりです。

  • Execute メソッド

    コマンドの処理です。 ボタンなどが押されたときに実行されます。

  • CanExecute メソッド

    Execute メソッドを実行できるかどうかを表します。 false を返すと、ボタンなどが非活性になり、押せなくなります。

  • CanExecuteChanged イベント

    CanExecute から返す値が変わるかもしれない場合に発生させます。 発生させると、CanExecute が再度呼ばれ、 ボタンなどの活性・非活性状態が再評価されます。

この ICommand インターフェイスを実装させたコマンドは、 ボタンとバインディングさせて使います。 そのためには、ビューモデルでコマンドインスタンスを得る プロパティを用意しておき、それをボタンなどの Command という プロパティにバインディングすることで、処理を実行します。

解答例

冒頭の力試しの解答例と解説を示します。

https://github.com/Geroshabu/WpfBootCamp/tree/main/Chapter2/Code/Sample/Sample

コマンドの用意

ICommand インターフェイスを実装した、 ShowMessageCommand クラスを用意しました。 Execute メソッドではメッセージボックスを出す処理をさせています。 特に活性・非活性制御はしないので、CanExecute メソッドは 常に true を返すようにしています。

internal class MessageCommand : ICommand
{
    public event EventHandler? CanExecuteChanged;

    public bool CanExecute(object? parameter) => true;

    public void Execute(object? parameter)
    {
        MessageBox.Show("ボタンが押されました。");
    }
}

コマンドの紐づけ

ビューモデルではコマンドを返すプロパティを用意します。

internal class MainWindowViewModel
{
    public ICommand MessageCommand { get; } = new MessageCommand();
}

最後に、ボタンの Command プロパティにバインディングします。

<Button Content="押せ"
        Command="{Binding MessageCommand}"
        Width="100" Height="50"/>

Exercise

次のプログラムを作ってみましょう。

次のような、財布を表す Wallet クラスがあるとします。

/// <summary>財布</summary>
internal class Wallet
{
    /// <summary>一万円札の枚数</summary>
    public int CountOf10000Yen { get; } = 1;
    /// <summary>五千円札の枚数</summary>
    public int CountOf5000Yes { get; } = 3;
    /// <summary>千円札の枚数</summary>
    public int CountOf1000Yen { get; } = 3;

    /// <summary>合計金額</summary>
    public int Sum
    {
        get
        {
            return 10000 * CountOf10000Yen
                + 5000 * CountOf5000Yes
                + 1000 * CountOf1000Yen;
        }
    }
}

この財布の中身を表示するプログラムを作ってみましょう。

起動すると、一万円札、五千円札、千円札の枚数が表示されます。 二千円札は...なかったことにしましょう。

「合計」ボタンを押すと、合計が表示されます。