52

Commandボタンプロパティをカスタム コマンドにバインドしてみましょう。

いつ実装ICommandし、いつから派生する必要がありRoutedCommandますか? RoutedCommand が ICommand を実装していることがわかります。

どのような場合に実装する必要がありICommandますか? MVVMモデルはどうですか?この目的にはどちらが適していますか?

4

2 に答える 2

69

お気づきのように、RoutedCommandクラスICommandインターフェースの実装であり、その機能が a の機能に似ている場合の主な違いは次のRoutedEventとおりです。

RoutedCommand の Execute メソッドと CanExecute メソッドには、通常の ICommand の場合とは異なり、コマンドのアプリケーション ロジックは含まれませんが、これらのメソッドは、要素ツリーを走査して CommandBinding を持つオブジェクトを探すイベントを発生させます。CommandBinding にアタッチされたイベント ハンドラーには、コマンド ロジックが含まれています。

Execute メソッドは、PreviewExecuted および Executed イベントを発生させます。CanExecute メソッドは、PreviewCanExecute および CanExecute イベントを発生させます。

の動作が望ましくない場合はRoutedCommand、独自の の実装を検討することになりますICommand。MVVM パターンに関しては、1 つの解決策とは言えませんが、それぞれ独自の方法論があるようです。ただし、私が遭遇したこの問題へのいくつかのアプローチを次に示します。

于 2009-07-16T12:34:28.803 に答える
28

Rich McGuire の回答に追加する唯一のことは、RoutedCommands (およびそのより一般的な子孫であるRoutedUICommandをイベント ハンドラーと結び付けて正しく動作させる必要があることです。

私が遭遇したほとんどの MVVM 実装は、ViewModel に対するバインドを利用しようとするため、ViewModel (View ではなく) が CanExecute/Execute ロジックを所有しています。

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

于 2009-07-16T12:49:28.933 に答える