本文へスキップ
BecomeCoder

C# WPFコース · 第1章 WPF ― デスクトップアプリ開発 · レッスン12

イベントとコマンド

ブラウザで完結

導入

ボタンクリックなどの操作に反応させる方法は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で推奨
  • RelayCommandICommandの汎用実装)を1つ用意すると、ラムダで手軽にコマンドを作れる
  • CanExecuteで「実行可能かどうか」を返すと、条件次第でボタンを自動的に無効化できる

詳細手順

  1. スターター140-wpf-events/starter.zipを開く
  2. まずイベント方式のボタンをF5で押し、MessageBoxが出ることを確認する
WPFアプリでボタンを押すとMessageBoxダイアログが表示された様子
Clickイベント:ボタン押下でMessageBoxを表示
  1. 次にコマンド方式のボタンを押し、ViewModel側の処理が呼ばれることを確認する(ロジックがViewに無いことに注目)

まとめ

  • イベント(Click)はコードビハインドに書く手軽な方法
  • コマンド(ICommand)はViewModelに処理を置きバインドする(MVVM推奨)
  • RelayCommandCanExecuteでロジック分離とボタン制御ができる

次回: ViewとViewModelを分ける設計「MVVM」です。

テンプレート構成(教材制作用メモ)

140-wpf-events/
└── starter.zip   # Clickイベント版とICommand版の両方 / RelayCommand / README

実際に動かしてみよう

下のエディタに XAML を書くと、右側のプレビューにその場で WPF 風のUIが描画されます。テキスト入力・チェック・選択はそのまま動き、`{Binding}` で結んだ TextBox と TextBlock は打った文字がリアルタイムで反映されます。本文の XAML を打ち込んだり、属性(Width・Margin・FontSize・色など)を書き換えたりして、レイアウトの変化を確かめながら進めましょう(C# のコードビハインドや Command、ItemsSource などC#側のデータに依存する処理は実行されません。それらは Visual Studio で試します)。

XAML (WPF) プレビュー

書いた XAML をその場で WPF 風の画面に描画する学習用プレビューを読み込みます(本物のWPFではなく、レイアウトとコントロールの見た目・{Binding}の双方向バインディングを再現したものです。C#のコードビハインド/Command は実行されません)。
スクロールして表示された時点でも自動で読み込まれます。