力試し
簡単なプログラムを作成してみます。 まずは自力でチャレンジしてみましょう。
起動すると、下記のような画面が現れ、
ボタンを押すと、下記のようなダイアログを 表示するプログラムを作成しましょう。
コマンドの概要
コマンドは、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; } } }
この財布の中身を表示するプログラムを作ってみましょう。
起動すると、一万円札、五千円札、千円札の枚数が表示されます。 二千円札は...なかったことにしましょう。
「合計」ボタンを押すと、合計が表示されます。