コマンドパターンについて混乱しています。コマンドについてはさまざまな説明があります。以下のコードは 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; }
}
}
ベストアンサー1
あなたのFindProductCommand
クラスは、ICommand
インターフェースとして使用できることを意味しますWPFWPF の指示これは、インターフェースの他の実装であるDelegateCommand
や でもなくRelayCommand
、 でもありません。RoutedCommand
ICommand
FindProductCommand
対DelegateCommand
/RelayCommand
一般に、 の実装がまたは とICommand
名付けられている場合、その意図は、インターフェースを実装するクラスを記述する必要はなく、必要なメソッドを/コンストラクタにパラメータとして渡すことです。DelegateCommand
RelayCommand
ICommand
DelegateCommand
RelayCommand
たとえば、クラス全体ではなく、次のように記述できます。
ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
parameter => _avm.FindProduct(),
parameter => _avm.CanFindProduct()
);
(定型コードの節約よりもおそらく大きなもう 1 つの利点は、ビューモデル内でDelegateCommand
/をインスタンス化するとRelayCommand
、コマンドがそのビューモデルの内部状態にアクセスできるようになることです。)
DelegateCommand
/のいくつかの実装RelayCommand
:
- Microsoft Prism DelegateCommand リファレンス
- WPFチュートリアルの実装と
ICommand
呼ばれるDelegateCommand
- 別の実装とも呼ばれている
DelegateCommand
- ののオリジナル実装
RelayCommand
ジョシュ・スミス
関連している:
FindProductCommand
対RoutedCommand
FindProductCommand
トリガーされると実行されますFindProduct
。
WPFの組み込みRoutedCommand
何か他のことをする:それはルーティングイベントこれは、ビジュアル ツリー内の他のオブジェクトによって処理できます。つまり、 を実行するために他のオブジェクトにコマンド バインディングをアタッチし、コマンドをトリガーする 1 つ以上のオブジェクト (ボタン、メニュー項目、コンテキスト メニュー項目など) に 自体を具体的にFindProduct
アタッチすることができます。RoutedCommand
関連する SO の回答: