【问题标题】:Why do I need getters and setters in ICommand? [duplicate]为什么我需要 ICommand 中的 getter 和 setter? [复制]
【发布时间】:2023-10-02 17:33:01
【问题描述】:

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(){}

行不通。为什么会这样?

【问题讨论】:

    标签: c# wpf mvvm icommand relaycommand


    【解决方案1】:

    绑定通常不适用于字段。大多数绑定基于 ComponentModel PropertyDescriptor 模型,该模型适用于属性。这会启用通知、验证,但这些都不适用于字段。

    所以是的,你需要属性。

    您可以在构造函数中初始化它们,或者一种常见的模式是使用带有支持字段和表达式主体属性的延迟加载样式语法

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

    【讨论】:

    • 啊,这很有意义。谢谢!
    最近更新 更多