ボタンCommand
プロパティをカスタムコマンドにバインドしてみましょう。
ICommand
をいつ実装し、RoutedCommand
から派生させるのですか? RoutedCommandはICommandを実装していますであることがわかります。
どの場合にICommand
を実装する必要がありますか? MVVMモデルはどうですか?どちらがこの目的に適していますか?
お気づきのとおり、 RoutedCommand
class はICommand
インターフェイスの実装であり、その機能が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の間の結合度がわずかに高いことを意味します(キャスト+メソッド呼び出しなど)。