その1「ICommandインターフェース」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127903.aspx
その2「GUIにコマンドを結びつける」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127927.aspx
その3「ショートカットとコマンドを結びつける」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127931.aspx
その4「ショートカットとコマンドを結びつけるXAML版」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127934.aspx
 今まで、その1で作ったHelloCommandを使いまわしてきたけど、今回でこいつともお別れ。
WPFには、RoutedCommandという便利なICommandの実装クラスが提供されているので、普通はそっちを使うことになってる。
 WPF的には、コマンドは意味を表すのであってロジックは含まないものらしい。
ロジックはExecuteイベントとかに紐付けて行う。
この紐付けを行うためには、CommandBindingというものを使うらしい。後は、CommandBindingをWindowとかのCommandBindingsに登録することでバッチリ機能するようになるって寸法だ。
 ということで、その4までのコードのHelloCommandをRoutedCommandに置き換えてみる。
  
using System.Windows;
using System.Windows.Input;
namespace WpfCommand
{
    public partial class Window1 : Window
    {
        public static readonly ICommand HelloCommand = new RoutedCommand("HelloCommand", typeof(Window1));
        public Window1()
        {
            InitializeComponent();
        }
    }
}
XAML側は前回と一緒
<Window x:Class="WpfCommand.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfCommand="clr-namespace:WpfCommand"
    Title="コマンド" Height="300" Width="300">
    <Window.InputBindings>
        <KeyBinding Command="{x:Static WpfCommand:Window1.HelloCommand}" Key="G" Modifiers="Control" />
        <MouseBinding Command="{x:Static WpfCommand:Window1.HelloCommand}">
            <MouseBinding.Gesture>
                <MouseGesture Modifiers="Control" MouseAction="LeftClick" />
            </MouseBinding.Gesture>
        </MouseBinding>
    </Window.InputBindings>
    <StackPanel>
        <Button Name="button" Content="Click!" Command="{x:Static WpfCommand:Window1.HelloCommand}" />
    </StackPanel>
</Window>
まだ何処にも「こんにちは世界」って表示するロジックを書いてないけど、とりあえず実行してみる。そうすると、ボタンがグレーになってクリック出来なくなってるのがわかる。当然クリックしても何も起きない。
 
 
この状態から、CommandBindingを使ってHelloCommandに「こんにちは世界」を表示するロジックを結び付けてみる。
using System.Windows;
using System.Windows.Input;
namespace WpfCommand
{
    public partial class Window1 : Window
    {
        public static readonly ICommand HelloCommand = new RoutedCommand("HelloCommand", typeof(Window1));
        public Window1()
        {
            InitializeComponent();
            // HelloCommandとHelloCommand_Executedの関連を表すCommandBindingを作る
            var helloCommandBinding = new CommandBinding(HelloCommand, HelloCommand_Executed);
            // それを登録する
            this.CommandBindings.Add(helloCommandBinding);
        }
        private void HelloCommand_Executed(object source, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("こんにちは世界");
        }
    }
}
これを実行すると、ボタンが押せるようになって「こんにちは世界」も表示されるようになる。
 
 
因みに、このCommandBindingの作成と登録もXAML側に移動させることが出来る。
移動させると下のような感じになる。
<Window x:Class="WpfCommand.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfCommand="clr-namespace:WpfCommand"
    Title="コマンド" Height="300" Width="300">
    <!-- コマンドバインディングの登録 -->
    <Window.CommandBindings>
        <CommandBinding Command="{x:Static WpfCommand:Window1.HelloCommand}" Executed="HelloCommand_Executed" />
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Command="{x:Static WpfCommand:Window1.HelloCommand}" Key="G" Modifiers="Control" />
        <MouseBinding Command="{x:Static WpfCommand:Window1.HelloCommand}">
            <MouseBinding.Gesture>
                <MouseGesture Modifiers="Control" MouseAction="LeftClick" />
            </MouseBinding.Gesture>
        </MouseBinding>
    </Window.InputBindings>
    <StackPanel>
        <Button Name="button" Content="Click!" Command="{x:Static WpfCommand:Window1.HelloCommand}" />
    </StackPanel>
</Window>