我有一个 Command
属性,此定义在视图模型中:
public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave);
每当INotifyDataErrorInfo
的ErrorsChanged
发射时,RaiseCanExecuteChanged
在RelayCommand
类中都调用,以启用/禁用按钮:
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的对象,因此未能更新状态