Ответ 1
Как уже упоминалось, это предполагаемое поведение DelagateCommand
, а не ошибка.
DelegateCommand
не создает событие CanExecuteChanged
автоматически, вам нужно поднять это событие вручную, вызвав RaiseCanExecuteChanged
, когда это необходимо. В то время как RelayCommand
реле для события CommandManager.RequerySuggested
для этого. Это событие возникает каждый раз, когда пользователь щелкает где-то или нажимает кнопку.
В ситуациях, когда это не очень удобно или нет подходящего места для вызова RaiseCanExecuteChanged
(например, в вашем сценарии вам нужно подписаться на событие PropertyChanged
на модели и т.д.), я создал следующую простую оболочку, гарантирует, что метод CanExecute
завернутой команды выполняется автоматически в событии CommandManager.RequerySuggested
:
public class AutoCanExecuteCommandWrapper : ICommand
{
public ICommand WrappedCommand { get; private set; }
public AutoCanExecuteCommandWrapper(ICommand wrappedCommand)
{
if (wrappedCommand == null)
{
throw new ArgumentNullException("wrappedCommand");
}
WrappedCommand = wrappedCommand;
}
public void Execute(object parameter)
{
WrappedCommand.Execute(parameter);
}
public bool CanExecute(object parameter)
{
return WrappedCommand.CanExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
Вы можете использовать его следующим образом:
DelegateSaveCommand = new AutoCanExecuteCommandWrapper(new DelegateCommand(Save, CanSaveDelegate));