为什么我需要在ICommand中使用getter和setter?

时间:2018-08-21 04:20:38

标签: c# wpf mvvm icommand relaycommand

C#/ MVVM的新手,对我来说这没有意义吗?

这是我从ICommand继承的RelayCommand的实现:

internal class RelayCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action _execute;
    public event EventHandler CanExecuteChanged = (sender, e) => {};

    public RelayCommand(Action execute) : this(execute, null){ }
    public RelayCommand(Action execute, Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => (_canExecute == null) ? true : _canExecute(parameter);

    public void Execute(object parameter) => _execute();
}

我通过测试发现自己根本无法做到这一点:

public RelayCommand TestCommand;

我必须这样做:

public RelayCommand TestCommand { get; set; }

否则在构造函数中声明命令,如下所示:

TestCommand = new RelayCommand(TestCommandFunction);

public void TestCommandFunction(){}

不起作用。为什么会这样?

1 个答案:

答案 0 :(得分:1)

绑定通常不适用于字段。大多数绑定基于 ComponentModel PropertyDescriptor 模型,该模型适用于属性。这样可以启用通知,验证功能,而其中的任何一项都不适用于字段。

是的,您需要属性。

您可以在构造函数中对其进行初始化,也可以使用带有后备字段和表达式主体属性的惰性加载样式语法作为常见模式

private RelayCommand _testCommand;

public RelayCommand TestCommand => _testCommand ?? (_testCommand = new RelayCommand(...));