Command
ボタンプロパティをカスタム コマンドにバインドしてみましょう。
いつ実装ICommand
し、いつから派生する必要がありRoutedCommand
ますか? RoutedCommand が ICommand を実装していることがわかります。
どのような場合に実装する必要がありICommand
ますか? MVVMモデルはどうですか?この目的にはどちらが適していますか?
Command
ボタンプロパティをカスタム コマンドにバインドしてみましょう。
いつ実装ICommand
し、いつから派生する必要がありRoutedCommand
ますか? RoutedCommand が ICommand を実装していることがわかります。
どのような場合に実装する必要がありICommand
ますか? MVVMモデルはどうですか?この目的にはどちらが適していますか?
お気づきのように、RoutedCommand
クラスはICommand
インターフェースの実装であり、その機能が a の機能に似ている場合の主な違いは次のRoutedEvent
とおりです。
RoutedCommand の Execute メソッドと CanExecute メソッドには、通常の ICommand の場合とは異なり、コマンドのアプリケーション ロジックは含まれませんが、これらのメソッドは、要素ツリーを走査して CommandBinding を持つオブジェクトを探すイベントを発生させます。CommandBinding にアタッチされたイベント ハンドラーには、コマンド ロジックが含まれています。
Execute メソッドは、PreviewExecuted および Executed イベントを発生させます。CanExecute メソッドは、PreviewCanExecute および CanExecute イベントを発生させます。
の動作が望ましくない場合はRoutedCommand
、独自の の実装を検討することになりますICommand
。MVVM パターンに関しては、1 つの解決策とは言えませんが、それぞれ独自の方法論があるようです。ただし、私が遭遇したこの問題へのいくつかのアプローチを次に示します。
Rich McGuire の回答に追加する唯一のことは、RoutedCommands (およびそのより一般的な子孫であるRoutedUICommandをイベント ハンドラーと結び付けて正しく動作させる必要があることです。
私が遭遇したほとんどの MVVM 実装は、ViewModel に対するバインドを利用しようとするため、ViewModel (View ではなく) が CanExecute/Execute ロジックを所有しています。
対照的に、イベント ハンドラーはその負担をビューに移します。その後、処理を ViewModel に伝達できますが、これは、ViewModel と View の間の結合度がわずかに高くなることを意味します (キャスト + メソッド呼び出しなど)。