ビューとモデルを疎結合するコマンドを解説。さらに、データ・バインディングとコマンドの仕組みを使ったWPFアプリのアーキテクチャ・パターンMVVMを紹介。
powered by Insider.NET
前回に引き続き、ビューとモデルの疎結合を実現するための仕組みの1つである、「コマンド」という機能について説明する。また、データ・バインディングとコマンドの仕組みを使ったWPFアプリケーションのアーキテクチャ・パターンである「MVVM(Model-View-ViewModel)パターン」についても紹介する。
前回も行ったように、WPFのコマンドの仕組みを説明する前に、コマンドに関連するGUIアプリケーションに対する要件を整理してみよう。
●意味論的なイベント処理(コマンド)
一般的なGUIアプリケーションでは、マウスのクリックやキーボードからの入力など、実操作レベルのイベントをそのまま処理するよりも、「コピー」や「貼り付け」などの意味論的なレイヤを通してイベント処理したい場合も多い。
このような考え方は、Figure 1に示すように、意味論的には同じ操作を、複数の入力操作で実行したい場合に有効である。WPFでは、この意味論的なイベントを「コマンド(command)」と呼んでいる。
●コマンドの実行可否
コマンドは常に実行できるわけではなく、モデル(=扱っているデータ)の状態によっては実行できない状態になることがある。例えば、ユーザーから入力されたデータが想定した形式でなければデータベースへの反映をさせないとか、ネットワーク切断時にはオンライン処理を実行できなくするといった場合である。
ここで、コマンドが実行できない状態にある場合、(そのコマンドに対応する)ビュー上のメニューやボタンを押せなくしたいという要求がある。実際、例えば多くのアプリケーションでは、コピー可能なテキストを選択していないときにはメニューの「コピー」の項目がグレー表示され、押せなくなっている。
注意が必要なのは、コマンドの実行可否はモデルの状態に応じて随時変化し、これに応じてボタンやメニューなどの有効/無効を切り替えなければならないということである。従って、モデルの持つ1つのデータを複数のビューから参照するための仕組み(=データ・バインディング)と同様に、データが変化したことを(各ビューに)通知する仕組み(=コマンド)が必要となる。
WPFでは、前回説明したデータ・バインディングと、今回説明していくコマンドという仕組みを用いることで、ビューとモデルの疎結合を保ちつつ、これらの要件を満たすことができる。
WPFでは、上記の要件でも説明したような、以下の2つの機能を提供する「コマンド」(command)という仕組みを持っている。
●コマンドの実体
実装上の話をすると、WPFのコマンドの実体はICommandインターフェイス(System.Windows.Input名前空間)を実装したクラスである。ICommandインターフェイスは以下のようなメンバを持っている。
コマンドには主に2通りの使い方があり、1つはデータ・バインディングを用いてビューの外部からコマンドを与える方法で、もう1つは「ルーティング・コマンド」と呼ばれる方法である。
次のページでは、この2つの方法の内容をそれぞれ説明する。
Copyright© Digital Advantage Corp. All Rights Reserved.