0

次のコード (MVVM に関する Josh Smith の記事) で、誰かが return _canExecute == null についての洞察を得ることができますか? true : _canExecute(パラメーター); ?

これは通常の if/else ステートメントですが、最後の部分がわかりません。

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
}

ありがとう。

4

2 に答える 2

2

_canExecuteはラムダ関数であり、どのコンストラクターがオブジェクトをインスタンス化するかに応じて、null にすることができRelayCommandます。したがって、CanExecutemethod の実装は、この関数が設定されているかどうかをチェックし、設定されていない場合は を返しますtrue。関数が割り当てられている場合は、それを評価し ( が与えられますparameter)、評価された値が の結果として返されCanExecuteます。

一言で言えばCanExecute、コンストラクターで渡された述語を使用して評価され、不足している場合は - が常に返されtrueます。

通常は配列/リストに使用されると質問しましたが、非常によく似た状況です。述語は、渡すことができる単なる関数です。このような述語をコレクションをフィルタリングするメソッドに渡すと、メソッドは他の関数と同じようにこの述語を呼び出すだけです。

于 2012-11-05T23:03:04.657 に答える
1

略記と考えてください:

if(_canExecute == null) 
{
    return true;
} 
else 
{
    return _canExecute(parameter);
}

コンテキストでは、_canExecute は、Predicate が RelayCommand からのものです。

于 2012-11-05T23:00:51.373 に答える