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

时间:2017-12-24 22:49:18

标签: c# wpf mvvm inotifypropertychanged icommand

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

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

每当ErrorsChanged的{​​{1}}被触发时,INotifyDataErrorInfo类都会调用RaiseCanExecuteChanged来启用/禁用按钮:

RelayCommand

命令的两个委托在构造函数中设置:

public void RaiseCanExecuteChanged()
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }

但是当错误状态发生变化时(调用public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod) { _TargetExecuteMethod = executeMethod; _TargetCanExecuteMethod = canExecuteMethod; } 时)RaiseCanExecuteChanged方法不会被调用,过了一段时间我改变了CanSave初始化方式来设置改为构造函数:

Command

它有效!但为什么呢?

1 个答案:

答案 0 :(得分:1)

在视图模型的构造函数中初始化./mvnw install dockerfile:build 时,它只在初始化视图模型时运行一次,但在使用以下内容定义SaveCommad

SaveCommand

你实际上在做:

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

在这种情况下,每当调用public RelayCommand SaveCommand { get { return new RelayCommand(OnSave, CanSave); } } 的getter时,它都会返回SaveCommand的新实例。因此,当调用RelayCommand时,它可能与当前绑定到UI的对象不同,因此无法更新状态