コマンドパターンについて混乱しています。コマンドについては非常に多くの異なる説明があります。以下のコードは委任コマンドだと思っていましたが、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; }
}
}
FindProductCommand
クラスは ICommand
インターフェイスを実装します。つまり、 WPFcommand 。 DelegateCommand
でも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
の実装:
ICommand
と呼ばれるDelegateCommand
のWPFチュートリアル実装DelegateCommand
とも呼ばれますRelayCommand
の元の実装 Josh Smithによる関連:
FindProductCommand
vs RoutedCommand
FindProductCommand
は、トリガーされるとFindProduct
を実行します。
WPFに組み込まれている RoutedCommand
は何か他のことを行います。ビジュアルツリー内の他のオブジェクトで処理できる ルーティングイベント を発生させます。つまり、他のオブジェクトにコマンドバインディングをアタッチしてFindProduct
を実行し、RoutedCommand
自体をコマンドをトリガーする1つ以上のオブジェクトに具体的にアタッチできます。ボタン、メニュー項目、またはコンテキストメニュー項目。
関連するいくつかのSO回答: