6

私はC#Silverlight開発用のMVVMを

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

そして、私は文脈で言及されているRelayCommandクラスについて混乱しています。コードは次のとおりです。

public class RelayCommand : ICommand
{
#region Fields

readonly Action<object> _execute;
readonly Predicate<object> _canExecute;        

#endregion // Fields

#region Constructors

public RelayCommand(Action<object> execute)
: this(execute, null)
{
}

public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
    if (execute == null)
        throw new ArgumentNullException("execute");

    _execute = execute;
    _canExecute = canExecute;           
}
#endregion // Constructors

#region ICommand Members

[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
    return _canExecute == null ? true : _canExecute(parameter);
}

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

public void Execute(object parameter)
{
    _execute(parameter);
}

#endregion // ICommand Members
}

この場合、私は実際にどのよう_execute_canExecute機能するのか理解していません。(私はC#を初めて使用し、アクションと述語が何であるかさえわかりません。彼らが代理人であることは知っていますが、それらの違いと動作方法は何ですか?)
また、プログラムでは、行がわかりませんでした。

    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }

誰かが私にこれについて説明してもらえますか、ありがとう!

4

2 に答える 2

2

ARelayCommandには2つの情報が必要です。

  1. コマンド実行時に実行するコード(_executeアクション)
  2. このコマンドを実行できるかどうかを判断するために実行する必要のあるコード(_canExecute述語)

AnActionは、を返すメソッドを表すデリゲートですvoid。この場合、_executeアクションは1つのパラメーター(an object)を取り、を返しますvoid

APredicateは、値を取り、ブール結果を返すデリゲートです。この場合、_canExecute述語はobject値を取り、を返しますbool

_executeとの_canExecute値は両方とも、RelayCommand個々のコマンドに固有のコマンドの部分であるため、構築時にに提供されます。

CanExecuteChangedイベントについて:

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

サブスクライバーがイベントをサブスクライブすると、addが呼び出され、サブスクライバーがサブスクライブを解除すると、removeが呼び出されます。上記のCanExecuteChangedイベントは単なるパススルーイベントです(つまり、サブスクライバーがCanExecuteChangedイベントをサブスクライブすると、自動的にイベントをサブスクライブしますCommandManager.RequerySuggested)。MSDNによると、CommandManager.RequerySuggestedイベントは...

CommandManagerがコマンドの実行能力を変更する可能性のある条件を検出したときに発生します。

サブスクライバーは、このイベントが発生CanExecuteしたときにメソッドを呼び出してRelayCommand、コマンドをまだ実行できるかどうかを判断する可能性が高いと思います。

于 2012-07-01T23:21:44.767 に答える
1

追加/削除はプロパティの取得/設定に似ていますが、代わりにイベント用です。追加コードは次の場合に呼び出されます

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

実行されます。-=が実行されると、削除コードが呼び出されます。イベント呼び出しリストからデリゲートを追加/削除するデフォルトの動作をオーバーライドする必要はめったにないため、この構文はあまりわかりません。

この場合、RelayCommandはCanExecuteChangedイベントをCommandManager.RequerySuggestedイベントにマッピングしているだけです。

于 2012-07-01T23:41:52.400 に答える