その7:http://blogs.wankuma.com/kazuki/archive/2008/03/20/128720.aspx
 さて、WPFのコマンドというものは、意味を定義するもので実装(動作)は定義しないものでした。
前回の例だと、HelloとWorldというコマンドを定義している。このHelloとWorld自信は、実行されたからって何が起きるということには一切関与してない。
あくまで、メニューやボタンはHelloやWorldしますよということを示してる。
 んで、HelloとWorldは何をしますという動作はCommandBindingでイベントハンドラと紐付けを行っています。
いいことだとは思いませんが、例えばHelloコマンドにDBからデータを取得してきて整形して出力するみたいな処理を書いてもOKです。
 こういう風になってくると、アプリケーションで共通のコマンドっていくつかあるよね?という事が考えられます。
どのプログラムのメニューを見ても大体あるコピーや開くや終了といったもの。
WPFのコマンドの仕組みだと、毎回同じようなものを定義することになりそうです。
ということで、WPFには予めいくつかのコマンドが定義されています。
 以下その一覧
  例えば、ApplicationCommandsにあるCloseコマンドとかは、ほぼすべてのアプリケーションで使うんじゃないかと思う。
なんたって閉じるですから。
ということで使ってみます。
 適当にプロジェクトを作成してWindow1にメニューを追加します。メニューには、ApplicationCommands.CloseをCommandプロパティにもつものを1つ用意。
CommandBindingでClose_Executedメソッドにバインドしてます。
  
<Window x:Class="WpfDefCommand.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="こまんど その8" Height="250" Width="250">
    <Window.CommandBindings>
        <!-- Closeコマンドが発行されたらClose_Executedを呼びます -->
        <CommandBinding Command="Close" Executed="Close_Executed" />
    </Window.CommandBindings>
    <Grid>
        <Menu>
            <MenuItem Header="ファイル(_F)">
                <!-- このメニューを押すとCloseコマンドを発行します -->
                <MenuItem Command="Close" />
            </MenuItem>
        </Menu>
    </Grid>
</Window>
 
コード側はClose_Executedでthis.Close()をしているだけ。
using System.Windows;
namespace WpfDefCommand
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void Close_Executed(object sender, RoutedEventArgs e)
        {
            // 自分自身を閉じます
            this.Close();
        }
    }
}
 
これを実行すると、閉じるメニューがある下のような画面が出てくる。当然閉じるを押すと閉じる。
 
ということで、共通的に使われそうなコマンドは予め用意されてるので、出来ればそちらを使うようにしましょう。
 
さて、この例のXAMLを見てみるとわかるように、ApplicationCommandsのCloseコマンドは、Closeと指定するだけで設定できている。
これは、ApplicationCommandsが特別扱いされてるみたいで、文字列からコマンドへのコンバータが色々してくれているみたい。今日名前だけ紹介したほかの~Commandsクラスにあるコマンドも優遇されててクラス名.コマンド名で定義できるみたいだ。
ということで、定義されているコマンドは積極的につかったほうが楽そうです。