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);
    }
}