В моей ViewModel я реализовал интерфейс IDataErrorInfo (вместе с INotifyPropertyChanged). Проверка ввода работает по назначению, у меня нет проблем.
У меня есть это свойство как часть IDataErrorInfo public string Error { get { return this[null]; } }
Насколько я понимаю, Error
должно быть пустым, если все проверенные входные данные проходят проверку, поэтому я передаю это как свой метод CanExecute.
return !string.IsNullOrEmpty(Error);
Но моя кнопка «Сохранить» никогда не активируется. Я предполагаю, что CanExecuteChanged
никогда не срабатывает. Если это правда, где и как я должен вызвать это?
Это мой класс RelayCommand. Я пробовал другие способы реализации, но результаты были такими же. Я думаю, что это работает, потому что кнопка «сохранить» активна, если я не передаю метод CanExecute конструктору.
public class RelayCommand : ICommand
{
private readonly Action execute;
private readonly Func<bool> canExecute;
public RelayCommand(Action execute, Func<bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute == null || canExecute();
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter) { execute(); }
}
Кнопка «сохранить»:
<Button Content="Save" Command="{Binding InsertCommand}"/>
Команда Вставки:
public RelayCommand InsertCommand { get; internal set; }
В конструкторе ViewModel:
InsertCommand = new RelayCommand(ExecuteInsert, CanExecuteInsert);
Можно выполнить:
bool CanExecuteInsert()
{
return !string.IsNullOrEmpty(Error);
}