属性更改时,不会调用按钮命令CanExecute

我有一个带有文本框和按钮的表单。

当该文本框的值发生变化时,button命令不会调用它的命令的CanExecute方法。

命令参数已设置但似乎没有更改。 加载窗口后,按钮保持禁用状态。

 

我知道绑定工作正常,因为我创建了一个接收目标绑定的行为,并在绑定更改时引发CanExecute。

通过此行为,CanExecute被正常调用。

  

视图模型:

 public class EditViewModel : INotifyPropertyChanged { private string _name; public EditViewModel() { SaveChangesCommand = new DelegateCommand(p => SaveChanges(), p => CanSaveChanges()); } public string Name { get { return _name; } set { if (value == _name) return; _name = value; OnPropertyChanged(); } } public DelegateCommand SaveChangesCommand { get; private set; } private void SaveChanges() { } private bool CanSaveChanges() { return !string.IsNullOrWhiteSpace(Name); } } 

DelegateCommand:

 public interface IBaseCommand : ICommand { void OnCanExecuteChanged(); } public class DelegateCommand : IBaseCommand { private readonly Action _execute; private readonly Func _canExecute; public DelegateCommand(Action execute, Func canExecute) { _execute = execute; _canExecute = canExecute; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return _canExecute(parameter); } public void Execute(object parameter) { _execute(parameter); OnCanExecuteChanged(); } public void OnCanExecuteChanged() { var handler = CanExecuteChanged; if (handler != null) handler(this, EventArgs.Empty); } } 

CallCommandCanExecuteWhenBindingChange:

 public class CallCommandCanExecuteWhenBindingChange : Behavior { public static readonly DependencyProperty TargetProperty; private ICommandBase _command; static CallCommandCanExecuteWhenBindingChange() { var dependency = new DependencyRegistry(); TargetProperty = dependency.Register(b => b.Target, s => s.OnTargetChange()); } public object Target { get { return TargetProperty.Get(this); } set { TargetProperty.Set(this, value); } } private void OnTargetChange() { if (_command == null && AssociatedObject != null) { var field = AssociatedObject.GetType().GetProperty("Command"); _command = (IBaseCommand)field.GetValue(AssociatedObject); } if (_command != null) _command.OnCanExecuteChanged(); } } 

有谁知道按钮为什么不调用CanExecute?

在您的DelegateCommand实现中, CanExecuteChanged应该添加/删除CommandManager.RequerySuggested事件

在CommandManager检测到可能会更改命令执行能力的条件时发生。

改为

 public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } }