その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
その5「RoutedCommand」:http://blogs.wankuma.com/kazuki/archive/2008/03/16/127942.aspx
今までコマンドはCommandプロパティに入れればいいんだ!みたいに乱暴に言ってたけど、このCommandプロパティってどういうものなの?ということに触れてみたいと思う。
このCommandプロパティは、System.Widows.Input.ICommandSourceというインターフェイスで定義されている。
メニューやボタンは、このインターフェイス(厳密にはButtonじゃなくてButtonBaseとかだけど)を実装するかたちで定義されている。
ICommandSourceには、今まで使ってきたCommandプロパティ以外にも2つのプロパティが定義されている。ICommandSourceの定義はたぶんこんな感じになってるはず。
interface ICommandSource {
Object CommandParameter { get; }
IInputElement CommandTarget { get; }
ICommand Command { get; }
}
プロパティが全部getだけなのは、コマンドの設定方法は実装側で好きにしてくれ!という意思に現れなんだろうか?
確かに、コマンドの実行方法を統一するだけならget出来れば無問題だ。
当然ながら、ICommandSourceを実装すれば自前のクラスにもコマンド対応!!とかできる。
実装例がMSDNにあったので、そっちを見ればOK。
方法:ICommandSourceを実装する
http://technet.microsoft.com/ja-jp/library/ms748978(VS.85).aspx
実装自体は、めんどくさいが簡単にできる。
因みに注意が必要なのは、CommandTargetプロパティは、CommandプロパティのインスタンスがRoutedCommandじゃないと無意味という仕様になってる。
こんな超汎用的な部分からRoutedCommandって優遇されてるみたい。