antsk blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

WPFのCommand

WPFのCommandとCommandBindingについてどうにも理解に苦しんだので記述。

Command と CommandSource



CommandとCommandSourceは下記のような関係にある。
Command.gif

つまり、

んで、これによって何がうれしいか?というと、
たとえば
・「ファイル」→「新規作成」メニュー NewMenu がある
・ツールバーに新規作成ボタン NewButton がある
・両方に NewCommand をセットする
ということをやれば、
NewCommandのCanExecuteを変更するだけで
ボタンとメニューの両方のEnable/Disableを変更できるし、
ボタンとメニューのどちらをクリックしても同じExecuteが呼び出されることになる。

……と、ここまでは理解しやすい。

CommandBinding



じゃーCommandBindingはなんなのだろう?
上記のICommandSource/Commandでひととおり完結しているんで何の役に立つんだ?ってことで悩んだ。

んで、内部処理を解析したわけではないけど、ドキュメントを見る限りだと、こーいう風につながっている。
CommandBinding.gif

そんで、たとえばこういうXAMLで

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Close"
Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<StackPanel>
<Button Content="CloseButton"
Command="ApplicationCommands.Close" />
</StackPanel>
</Window>

CommandSourceがコマンドを実行すると下記のように処理が走る、っぽい。
commandsequence.gif


・RoutedCommandのExecuteで、CommandManagerに問い合わせる
・CommandManagerはCommandTarget(デフォルトはフォーカスのあるコントロール)のCommandBindingsをチェック。
  ・実行したCommandが設定されてるCommandBindingがあったら、そのExecutedイベントを実行
・その後、UIツリーを順に親に向かってたどりながら上記のCommandBindingイベントを発生させていく。


……てな動きをする。と思う。

んで何の役に立つのか?



上記のような動きをすることにより、

RoutedCommandはstaticに宣言するだけでよい


・RoutedCommandには何のロジックもなく、
・CommandManagerによる検索パスによって、
 CommandTargetからたどった親要素でしかイベントが発生しない
ということになるので、
たとえばMDI子ウインドウのボタンで実行したReloadCommandが別のウインドウに影響を与えることはない。
よってstaticに1つだけあるだけでよい。

同じコマンドの発行が状況(フォーカスコントロール)によって対象が変わる


CommandBindingをリーフレベルのコントロールにつけておくと、
Commandを単に実行するだけでフォーカス位置に応じて適切なコントロールが操作される


……ってとこか?

MVVMと


MVVMパターンで、ダイアログ(新しいWindowオブジェクト)を作成して表示する類のコマンドってどうするのかなー?と思ってた。

・MVVMのサンプルで、ViewModelにCommandを定義してExecuteコールバックでViewModelのメソッドを呼ぶパターンしか見たことなかった
・ダイアログを表示するに当たってOwner = Viewに設定したいけど、ViewModelからViewが見えないので苦しい

……ってのがあったけど、そーいうのはひょっとして
・staticなRoutedCommand変数を用意して、
・WindowのCommandBindingでバインド
・Executedイベントで別Windowを作成して表示

とかで実装するのがよいのかもしれん。

ぐーあー。でかい画像が見切れる。
FC2はあんまりプログラミングのネタにむかないんかな。
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2009/08/26(水) 00:08:35|
  2. WPF
  3. | トラックバック:1
  4. | コメント:0
<<MVVMでViewModelからダイアログを扱いたい | ホーム | ジェネリック WCFサービス>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://antsk.blog99.fc2.com/tb.php/3-11f32aaf
この記事にトラックバックする(FC2ブログユーザー)

WPFのRoutedCommandとCommandBinding

ふつーに、WPFなアプリを作ってて、行き詰まりというか、悩んでたことが、解決した。 解決した内容とかは、他のWebサイトとかにも載ってる内容なのでそっちを参考にするっとφ(。。 気が向いたら概要を図にまとめてもいいかな、と思う。 どちらにしても、そこにたどり着い...
  1. 2009/09/13(日) 13:03:50 |
  2. すふぃあの記憶

プロフィール

antsk

Author:antsk
主にC#のプログラマ。

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

未分類 (0)
.net (1)
WPF (8)

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。