制作ICommand和ViewModel

时间:2017-07-23 12:47:58

标签: c# uwp

我为C#和UWP应用程序编程。我正在使用视频来学习ICommand,但在那个视频中,我们创建了一个这样的类。你能解释一下这是什么吗? 特别是return _canExecute == null || _canExecute(parameter);的含义是什么?因为我在C#编码中没有看到类似的东西。我没有看到这种打字方法。

class DelegateCommand : ICommand
{
    private Action<object> _execute;
    private Func<object, bool> _canExecute;
    public event EventHandler CanExecuteChanged;

    public DelegateCommand (Action<object> execute, Func<object,bool> canExecute = null)
    {
        if (execute == null)
        {
            throw new ArgumentNullException(nameof(execute));
        }
        _execute = execute;
        _canExecute = canExecute;
    }
    public void  RaiseCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }
    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

return _canExecute == null || _canExecute(parameter);

返回true是其中一个或两个语句评估为true

因此,如果_canExecute函数委托为null或函数调用结果为true,则返回true,否则返回false

这是一个基本的逻辑OR操作。

为什么以这种方式编写是因为如果语句的左侧为真,它会立即返回true而不评估右侧。如果左侧评估为false,则仅查看右侧。

哪个是安全的,因为这意味着_canEcevute不是null,因此_canEcevute(parameter)可以安全地调用。

答案 1 :(得分:0)

让我们先看一下构造函数签名:

DelegateCommand (Action<object> execute, Func<object,bool> canExecute = null)

如您所见,第二个参数canExecute是可选的,默认值为null。此类的语义如下所示:通过传递第二个参数(不等于null),当且仅当Action<object> execute应用于对象返回{{1}时,才声明Func<object,bool> canExecute是可执行的}。如果您未传递第二个参数或传递true作为第二个参数,则表明始终可以执行null。另请注意Action<object> execute未检查bool CanExecute(object parameter)的值,因此您必须自己执行此操作,以避免因参数错误而引发的异常。

现在问题:行

void Execute(object parameter)

只是一种较短的写作形式

return _canExecute == null || _canExecute(parameter);