2016-05-01 15 views
0

私は最近、(MVVMパターンで)WPFの学習を始めました。私はICommand実装についての質問...C#ICommand/RelayCommand

private ICommand _confirmOptionCommand; 

public ICommand ConfirmOptionCommand 
{ 
    get 
    { 
     if (_confirmOptionCommand == null) 
     { 
     _confirmOptionCommand = new RelayCommand(ConfirmOptionMethod); 
     } 
     return _confirmOptionCommand; 
    } 
} 

private void ConfirmOptionMethod() { ... } 

を持っている。しかし、私はこのように書くことができます:どのような利点

private RelayCommand _confirmOptionCommand; 

public RelayCommand ConfirmOptionCommand { ... } 

private void ConfirmOptionMethod() { ... } 

を持っているICommand?または、それらの違いは何ですか?

+2

'' ICommand''は、 '' RelayCommand''が実装しているインタフェースです。 –

答えて

0

RelayCommandisICommandこれは、コマンドの実行時にデリゲートを呼び出すことができるようになりました。

RelayCommandの代わりにICommandを変数型として記述する場合、依然としてICommandオブジェクトを指す必要があります。しかし、ICommandインターフェイスにのみアクセスできます。オブジェクトにある他の要素を必要とする場合は、派生クラス参照が必要です。私たちの場合、それはRelayCommand参照です。..

はここRelayCommandがのように見えるかもしれません(つもりはないコンパイル、しかし、あなたはそれを得る)方法は次のとおりです。

public class RelayCommand<T> : ICommand { 
    private Action<T> action; 

    public RelayCommand(T action){ 
     this.action = action; 
    } 

    public bool CanExecute(obj param){ 
     return true; 
    } 

    public void Execute(obj param){ 
     this.action((T)param); 
    } 

    public CanExecuteEventHandler CanExecuteChanged; 

} 

作品などRoutedUICommandなどICommandの他の種類があります。イベントハンドラを使用します。あなたの質問へ

+0

@Downvoter、説明には注意してください。 –

+0

よろしくお願いいたします。私はそれがそうだったと思ったが、今あなたは疑念を払拭しました:) – xitryuga

+0

@xitryuga、あなたの質問に答えたら答えを受け入れてください:) –

0

最も簡単な答えは疎結合クラス(ICommand)が消費され、独立して、他の具体的なクラス(RelayCommand)のテストすることができる、と言うには、それはが緩く

を結合させることであろう。

あなたが呼び出すために(DelegateCommandのような)将来的には他のいくつかの委任コマンドにRelayCommandを変更したい場合はRelayCommand(あなたは具象クラス参照を使用していた。この場合には、それはすべての消費者を置き換えるために多くの時間と労力がかかります、考えてみましょう)。

クライアントでICommandを使用しているときに、クライアント(コンシューマ)に変更を加えずにICommandを実装する具体的なクラスに切り替える方法があります。