0

在下面的代码(乔什史密斯关于 MVVM 的文章)中,有人能给我一些关于 return _canExecute == null 的见解吗?真:_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是 lambda 函数,它可以为 null,具体取决于哪个构造函数将实例化RelayCommand对象。因此,CanExecute方法的实现检查是否设置了此函数,如果没有,则返回true,如果已分配函数,则对其进行评估(给定parameter),并将评估的值作为 的结果返回CanExecute

简而言之:CanExecute将使用构造函数中传递的任何谓词进行评估,如果缺少一个 - 将始终返回true

你问过这通常用于数组/列表 - 这是非常相似的情况。谓词只是一个可以传递的函数。当您将此类谓词传递给过滤集合的某个方法时,该方法只是像调用任何其他函数一样调用此谓词。

于 2012-11-05T23:03:04.657 回答
1

将其视为简写:

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

在上下文中,_canExecute 是您的谓词来自 RelayCommand 的任何内容。

于 2012-11-05T23:00:51.373 回答