第6回 「コマンド」と「MVVMパターン」を理解する連載:WPF入門(1/3 ページ)

ビューとモデルを疎結合するコマンドを解説。さらに、データ・バインディングとコマンドの仕組みを使ったWPFアプリのアーキテクチャ・パターンMVVMを紹介。

» 2010年11月09日 00時00分 公開
連載:WPF入門
業務アプリInsider/Insider.NET

powered by Insider.NET

「連載:WPF入門」のインデックス

連載目次

 前回に引き続き、ビューとモデルの疎結合を実現するための仕組みの1つである、「コマンド」という機能について説明する。また、データ・バインディングとコマンドの仕組みを使ったWPFアプリケーションのアーキテクチャ・パターンである「MVVM(Model-View-ViewModel)パターン」についても紹介する。

■GUIアプリケーションに対する要件

 前回も行ったように、WPFのコマンドの仕組みを説明する前に、コマンドに関連するGUIアプリケーションに対する要件を整理してみよう。

意味論的なイベント処理(コマンド)

 一般的なGUIアプリケーションでは、マウスのクリックやキーボードからの入力など、実操作レベルのイベントをそのまま処理するよりも、「コピー」や「貼り付け」などの意味論的なレイヤを通してイベント処理したい場合も多い。

 このような考え方は、Figure 1に示すように、意味論的には同じ操作を、複数の入力操作で実行したい場合に有効である。WPFでは、この意味論的なイベントを「コマンド(command)」と呼んでいる。

Figure 1: 生の入力イベントと意味論的なイベント

コマンドの実行可否

 コマンドは常に実行できるわけではなく、モデル(=扱っているデータ)の状態によっては実行できない状態になることがある。例えば、ユーザーから入力されたデータが想定した形式でなければデータベースへの反映をさせないとか、ネットワーク切断時にはオンライン処理を実行できなくするといった場合である。

 ここで、コマンドが実行できない状態にある場合、(そのコマンドに対応する)ビュー上のメニューやボタンを押せなくしたいという要求がある。実際、例えば多くのアプリケーションでは、コピー可能なテキストを選択していないときにはメニューの「コピー」の項目がグレー表示され、押せなくなっている。

 注意が必要なのは、コマンドの実行可否はモデルの状態に応じて随時変化し、これに応じてボタンやメニューなどの有効/無効を切り替えなければならないということである。従って、モデルの持つ1つのデータを複数のビューから参照するための仕組み(=データ・バインディング)と同様に、データが変化したことを(各ビューに)通知する仕組み(=コマンド)が必要となる。

 WPFでは、前回説明したデータ・バインディングと、今回説明していくコマンドという仕組みを用いることで、ビューとモデルの疎結合を保ちつつ、これらの要件を満たすことができる。

■コマンド

 WPFでは、上記の要件でも説明したような、以下の2つの機能を提供する「コマンド」(command)という仕組みを持っている。

  • クリックやキー入力などの実操作レベルのイベントではなく、コピーや貼り付けなどの意味的なイベント処理を行う
  • モデルの状態に応じてボタンを押せなくするなどして、コマンドを実行の可否を切り替える

コマンドの実体

 実装上の話をすると、WPFのコマンドの実体はICommandインターフェイス(System.Windows.Input名前空間)を実装したクラスである。ICommandインターフェイスは以下のようなメンバを持っている。

  • Executeメソッド: コマンドを実行する。
  • CanExecuteメソッド: コマンドが実行可能な状態にあるかどうかを判定する。
  • CanExecuteChangedイベント: INotifyPropertyChangedインターフェイスのPropertyChangedイベントと同様、コマンド実行の可否が変化したことを通知するためのイベント。

 コマンドには主に2通りの使い方があり、1つはデータ・バインディングを用いてビューの外部からコマンドを与える方法で、もう1つは「ルーティング・コマンド」と呼ばれる方法である。

 次のページでは、この2つの方法の内容をそれぞれ説明する。

       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。