Команда Button CanExecute не вызывается при изменении свойства

У меня есть форма с текстовым полем и кнопкой.

Когда это текстовое поле изменило его значение, команда кнопки не вызывает метод CanExecute его команды.

Параметр команды установлен, но, похоже, не изменяется. После загрузки windows кнопка остается отключенной.

 

Я знаю, что привязка работает, потому что я создал поведение, которое получает привязку к цели и поднимает CanExecute при изменении привязки.

При таком поведении CanExecute вызывается нормально.

  

ViewModel:

 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 event

Возникает, когда CommandManager обнаруживает условия, которые могут изменить возможность выполнения команды.

измените его на

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