C# 为什么CanExecute只有在它';是否在视图模型的构造函数中初始化?
我有一个C# 为什么CanExecute只有在它';是否在视图模型的构造函数中初始化?,c#,wpf,mvvm,inotifypropertychanged,icommand,C#,Wpf,Mvvm,Inotifypropertychanged,Icommand,我有一个命令属性,在视图模型中有以下定义: public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave); 每当激发INotifyDataErrorInfo的错误更改时,在RelayCommand类中调用RaiseCanceChanged,以启用/禁用按钮: public void RaiseCanExecuteChanged() { CanExecuteChanged(t
命令
属性,在视图模型中有以下定义:
public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave);
每当激发INotifyDataErrorInfo的错误更改时,在RelayCommand
类中调用RaiseCanceChanged
,以启用/禁用按钮:
public void RaiseCanExecuteChanged()
{
CanExecuteChanged(this, EventArgs.Empty);
}
命令的两个委托在构造函数中设置:
public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod)
{
_TargetExecuteMethod = executeMethod;
_TargetCanExecuteMethod = canExecuteMethod;
}
而且它有效!但是为什么呢?当您在视图模型的构造函数中初始化SaveCommad
时,它只在视图模型初始化时运行一次,但是当您使用以下方法定义SaveCommand
时:
public RelayCommand SaveCommand => new RelayCommand(OnSave, CanSave);
你实际上在做:
public RelayCommand SaveCommand {
get {
return new RelayCommand(OnSave, CanSave);
}
}
在这种情况下,只要调用SaveCommand
的getter,它就会返回RelayCommand
的新实例。因此,当调用raisecancecutechanged
时,它可能不是当前绑定到UI的同一个对象,因此无法更新状态您说CanSave
方法没有被调用,但我们无法告诉何时以及谁将调用它。另外,CanExecuteChanged
方法做什么?现在,很难从您发布的代码中找出问题所在。换句话说,我们没有足够的信息或cose来重现您的问题。
public RelayCommand SaveCommand {
get {
return new RelayCommand(OnSave, CanSave);
}
}