web-dev-qa-db-ja.com

Delegatecommand、relaycommand、routedcommandの違い

コマンドパターンについて混乱しています。コマンドについては非常に多くの異なる説明があります。以下のコードは委任コマンドだと思っていましたが、relaycommandについて読んだ後、疑問に思います。

Relaycommand、delegatecommand、およびroutedcommandの違いは何ですか。投稿したコードに関連する例を示すことは可能ですか?

class FindProductCommand : ICommand
{
    ProductViewModel _avm;

    public FindProductCommand(ProductViewModel avm)
    {
        _avm = avm;
    }

    public bool CanExecute(object parameter)
    {
        return _avm.CanFindProduct();
    }

    public void Execute(object parameter)
    {
        _avm.FindProduct();
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

}
46
Zaz

FindProductCommandクラスは ICommand インターフェイスを実装します。つまり、 WPFcommandDelegateCommandでもRelayCommandでも、_RoutedCommandでもありません。これらはICommandインターフェイスの他の実装です。


FindProductCommand vs DelegateCommand/RelayCommand

一般的に、ICommandの実装の名前がDelegateCommandまたはRelayCommandである場合、意図はICommandを実装するクラスを記述する必要がないことです。インタフェース;むしろ、必要なメソッドをパラメーターとしてDelegateCommand/RelayCommandコンストラクターに渡します。

たとえば、クラス全体ではなく、次のように記述できます。

ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
    (parameter) => _avm.FindProduct(),
    (parameter) => _avm.CanFindProduct()
);

DelegateCommand/RelayCommandの実装:

関連:


FindProductCommand vs RoutedCommand

FindProductCommandは、トリガーされるとFindProductを実行します。

WPFに組み込まれている RoutedCommand は何か他のことを行います。ビジュアルツリー内の他のオブジェクトで処理できる ルーティングイベント を発生させます。つまり、他のオブジェクトにコマンドバインディングをアタッチしてFindProductを実行し、RoutedCommand自体をコマンドをトリガーする1つ以上のオブジェクトに具体的にアタッチできます。ボタン、メニュー項目、またはコンテキストメニュー項目。

関連するいくつかのSO回答:

52
Zev Spitz