TOC

This article is currently in the process of being translated into Japanese (~92% done).

Commands:

Introduction to WPF Commands

このチュートリアルの以前の章で、ボタンのクリックやメニューアイテムのようなイベントの扱いについて学びました。現代的なインターフェースにおいては、関数は、ユーザーの複数の場所からの異なる操作によって呼び出しできるのが普通です。

例えば、メインメニューとツールバーを持つ普通のインターフェースがある場合、New や Open のような操作はメニューやツールバーやコンテキストメニュー(アプリケーション領域で右クリックすると現れる)と Ctrl+N と Ctrl+O のキーボードショートカットで使用できます。

これらのアクションは、普通、全く同じコードを実行する必要があります。なので WinForms アプリケーションではそれぞれのイベントを定義する必要があり、それらは共通の関数を呼びます。この例では少なくとも3つのイベントハンドラと、キーボードショートカットを処理するコードが必要になります。これは理想的ではありません。

コマンド

WPFでは、Microsoft はコマンドと呼ばれる概念の改善方法を試しています。これはアクションを一箇所で定義し、メニューアイテムやツールバーボタンなどの全てのユーザーインターフェースコントロールからそれを参照します。WPFはキーボードショートカットもチェックしていて、もしあるなら、それらを適切なコマンドに渡し、これをアプリケーションのキーボードショートカットを提供するための理想的な方法にします。

コマンドは、同じ関数への入り口が複数あることに対応するときの問題も解決します。WinForms アプリケーションでは、機能が無効の場合、そのユーザーインターフェースを無効にするコードを書く必要があります。例えば、アプリケーションが「切り取り」のようなクリップボードコマンドを使える場合、テキストが選択されているときだけ有効なので、テキストの選択が変更されるたびに、手動でメインメニュー、ツールバーボタン、コンテキストメニューそれぞれの有効・無効を制御する必要がります。

WPFのコマンドでこれは一元化されます。一つのメソッドで、与えられたコマンドが実行出来るかどうかを決定します。そしてWPFは全てのスクライビングされたインターフェース要素を自動でONまたはOFFに切り替えます。これは応答が早くダイナミックなアプリケーションを非常に作りやすくします。

コマンドバインディング

コマンドはそれ自身では実質的に何もしません。コマンドのルートは一つのイベントと2つの関数 Execute() と CanExecute() だけ定義された ICommand インターフェースで構成されています。最初の関数は実際の動作をするためのもので、2つ目は動作が有効かどうかを決定します。コマンドを実際に動作をさせるために、コマンドとコードをリンクする必要があります。これを行う CommandBinding の出番です。

CommandBinding は通常、ウィンドウまたはユーザーコントロールで定義され、操作するコマンドの参照を保持しています。同様に、コマンドの Execute() と CanExecute() イベントの実際のイベントハンドラも持っています。

あらかじめ定義されているコマンド

もちろん、次の章の中で紹介するように、独自のコマンドを定義することは出来ますが、もっと簡単にするためにWPFチームは100を超える一般的なコマンドを定義しています。それらは5つのカテゴリに分かれており、ApplicationCommands, NavigationCommands, MediaCommands, EditingCommands と ComponentCommands と呼ばれます。特に ApplicationCommands には、New, Open, Save, Cut, Copy といった大変良く使うコマンドが含まれています。

まとめ

コマンドでは、単一のイベントハンドラを使って、いろいろな場所からの共通のアクションに応答できます。また現在の利用の可能性と状態に基づいてユーザーインターフェース要素の有効と無効を簡単に操作できます。これは全て論理でしたが、次の章ではどの様にコマンドが使われるか、カスタムコマンドをどのようにして定義するのかを議論します。

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!