導入
ボタンクリックなどの操作に反応させる方法は2つあります。手軽な**イベント(Click)と、MVVMで推奨されるコマンド(ICommand)**です。両者の違いと使い分けを学びます。
図解
flowchart TB
subgraph event["イベント(コードビハインド)"]
BTN1["Button Click=..."] --> CB["MainWindow.xaml.cs の<br/>Button_Click メソッド"]
end
subgraph command["コマンド(MVVM向き)"]
BTN2["Button Command={Binding SaveCommand}"] --> VM["ViewModel の SaveCommand"]
end
style command fill:#e8f5e9
XAMLサンプル(読み物)
<!-- 方法1: イベント(手軽)。Clickにコードビハインドのメソッドを指定 -->
<Button Content="挨拶" Click="OnGreetClick" />
<!-- 方法2: コマンド(MVVM向き)。ViewModelのICommandにバインド -->
<Button Content="保存" Command="{Binding SaveCommand}" />
// 方法1のコードビハインド(MainWindow.xaml.cs)
private void OnGreetClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("こんにちは!");
}
// 方法2: ICommand を実装(ViewModelに置く。ロジックがViewから分離できる)
public class RelayCommand : ICommand
{
private readonly Action _execute;
public RelayCommand(Action execute) => _execute = execute;
public bool CanExecute(object? parameter) => true;
public void Execute(object? parameter) => _execute();
public event EventHandler? CanExecuteChanged;
}
- イベント(Click):
MainWindow.xaml.cs(コードビハインド)にメソッドを書く。手軽だがViewにロジックが混ざる - コマンド(ICommand):
ViewModelに処理を置き、Command="{Binding ...}"でバインド。ロジックをViewから分離できるのでMVVMで推奨 RelayCommand(ICommandの汎用実装)を1つ用意すると、ラムダで手軽にコマンドを作れるCanExecuteで「実行可能かどうか」を返すと、条件次第でボタンを自動的に無効化できる
詳細手順
- スターター
140-wpf-events/starter.zipを開く - まずイベント方式のボタンをF5で押し、
MessageBoxが出ることを確認する
- 次にコマンド方式のボタンを押し、
ViewModel側の処理が呼ばれることを確認する(ロジックがViewに無いことに注目)
まとめ
- イベント(Click)はコードビハインドに書く手軽な方法
- コマンド(ICommand)はViewModelに処理を置きバインドする(MVVM推奨)
RelayCommand+CanExecuteでロジック分離とボタン制御ができる
次回: ViewとViewModelを分ける設計「MVVM」です。
テンプレート構成(教材制作用メモ)
140-wpf-events/
└── starter.zip # Clickイベント版とICommand版の両方 / RelayCommand / README