50

コマンドパターンについて混乱しています。コマンドについては非常に多くの異なる説明があります。以下のコードはdelegatecommandだと思いましたが、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; }
    }

}
4

1 に答える 1

57

クラスはインターフェイスをFindProductCommand実装しICommandます。つまり、それをWPFコマンドとして使用できます。インターフェースの他の実装である や ではありませんDelegateCommandRelayCommandRoutedCommandICommand


FindProductCommandDelegateCommand/RelayCommand

一般に、 の実装にorICommandという名前を付ける場合、その意図は、インターフェイスを実装するクラスを記述する必要がないことです。むしろ、必要なメソッドをパラメーターとして/コンストラクターに渡します。DelegateCommandRelayCommandICommandDelegateCommandRelayCommand

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

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

(別の、定型コードの節約よりもおそらく大きな利点 -ビューモデル内でDelegateCommand/をインスタンス化するRelayCommandと、コマンドはそのビューモデルの内部状態にアクセスできます。)

DelegateCommand/のいくつかの実装RelayCommand:

関連している:


FindProductCommandRoutedCommand

トリガーFindProductCommandされると実行さFindProductれます。

WPF の組み込みは別の処理を行います。ビジュアル ツリー内の他のオブジェクトで処理できるルーティング イベントRoutedCommandを発生させます。つまり、実行する他のオブジェクトにコマンド バインディングをアタッチし、コマンドをトリガーする 1 つまたは複数のオブジェクト (ボタン、メニュー項目、コンテキスト メニュー項目など) にコマンド バインディング自体をアタッチできます。FindProductRoutedCommand

関連する SO の回答:

于 2013-01-06T10:27:22.180 に答える