2009-07-16 9 views
45

カスタムコマンドにバインドされたボタンCommandがあります。WPF ICommandとRoutedCommandの比較

いつICommandを実装する必要がありますか?RoutedCommandから派生するタイミングを教えてください。私はRoutedCommandがICommandを実装していることがわかります。

この場合、ICommandを解読する必要がありますか? MVVMモデルはどうですか?この目的のためにどちらが適していますか?あなたがRoutedCommand class気づいてきたように

答えて

63

ICommandインタフェースの実装である、その主な違いであれば、その機能は、のと同様であるRoutedEvent

実行し、RoutedCommandの上のCanExecuteメソッドが含まれていません。コマンドのアプリケーションロジックは典型的なICommandの場合と同じですが、これらのメソッドは要素ツリーを走査してCommandBindingでオブジェクトを探すイベントを発生させます。 CommandBindingに添付されたイベントハンドラには、コマンドロジックが含まれています。

Executeメソッドは、PreviewExecutedイベントとExecutedイベントを発生させます。 CanExecuteメソッドは、PreviewCanExecuteイベントとCanExecuteイベントを発生させます。あなたはICommandの独自の実装を見ていることでしょうRoutedCommandの振る舞いをしたくない場合は

。 MVVMパターンに関しては、私はその1つの解決策を言うことはできません、誰もが独自の方法論を持っているようです。

+0

+1 – micahtan

+0

ありがとうございます。私が考える最も重要なのは、CommandBindingを使ってオブジェクトを探しているツリーをトラバースすることです。 MVVMのように私はCommandBindingsを避けたい、私はICommandを決定する。 –

22

のみ:しかし、ここで私が遭遇してきたこの問題にはいくつかのアプローチがありますリッチ・マクガイアの答えに追加するものは、RoutedCommands(およびそれらのより一般的な子孫RoutedUICommandは、正常に動作するようにイベントハンドラを組み込む必要があるということです)

MVVMのほとんどの実装私はViewModelとのバインディングを活用しようとしているため、ViewModel(ビューではなく)がCanExecute/Executeロジックを所有しています。

対照的に、イベントハンドラはその負担をビューに移します。この処理はViewModelに伝播できますが、これはViewModelとView(キャスト+メソッド呼び出しなど)の結合度がやや高いことを意味します。

関連する問題