为什么 CanExecute 仅在视图模型的构造函数中初始化时才被调用?

Why CanExecute only get called when it's initialized in the constructor of the view model?

我有一个 Command 属性,在视图模型中有这个定义:

public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave);

每当 INotifyDataErrorInfoErrorsChanged 被触发时, RaiseCanExecuteChangedRelayCommand class 中被调用,到 enable/disable 按钮:

public void RaiseCanExecuteChanged()
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }

命令的两个委托在构造函数中设置:

public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod)
        {
            _TargetExecuteMethod = executeMethod;
            _TargetCanExecuteMethod = canExecuteMethod;
        }

但是当错误状态改变时(当调用RaiseCanExecuteChanged时)CanSave方法没有被调用,过了一会儿我改变了Command初始化方式来设置在构造函数中改为:

    public AddEditCustomerViewModel()
    {
        SaveCommand = new RelayCommand(OnSave, CanSave);
    }
    public RelayCommand SaveCommand {get;}

而且有效!但是为什么?

当您在视图模型的构造函数中初始化 SaveCommad 时,它只会在视图模型初始化时 运行 一次,但是当您定义 SaveCommand 时使用:

public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave);

你实际上在做:

public RelayCommand SaveCommand {
    get {
        return new RelayCommand(OnSave, CanSave);
    }
}

在这种情况下,每当调用 SaveCommand 的 getter 时,它都会 returns 一个 RelayCommand 的新实例。因此,当 RaiseCanExecuteChanged 被调用时,它可能不是当前绑定到 UI 的同一个对象,因此无法更新状态