为什么 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);
每当 INotifyDataErrorInfo
的 ErrorsChanged
被触发时, RaiseCanExecuteChanged
在 RelayCommand
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 的同一个对象,因此无法更新状态
我有一个 Command
属性,在视图模型中有这个定义:
public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave);
每当 INotifyDataErrorInfo
的 ErrorsChanged
被触发时, RaiseCanExecuteChanged
在 RelayCommand
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 的同一个对象,因此无法更新状态