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



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

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

每当INotifyDataErrorInfoErrorsChanged发射时,RaiseCanExecuteChangedRelayCommand类中都调用,以启用/禁用按钮:

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,它就会返回RelayCommand的新实例。因此,当调用RaiseCanExecuteChanged时,它可能不是当前绑定到UI的对象,因此未能更新状态

最新更新