В моей модели ViewModel я реализовал интерфейс IDataErrorInfo (вместе с INotifyPropertyChanged). Проверка ввода работает по назначению, у меня нет проблем.Связывание команд WPF с проверкой входных данных - как включить кнопку «Сохранить», только если все введенные значения действительны.
У меня есть это свойство как часть 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}"/>
InsertCommand:
public RelayCommand InsertCommand { get; internal set; }
В конструкторе ViewModel:
InsertCommand = new RelayCommand(ExecuteInsert, CanExecuteInsert);
CanExecute:
bool CanExecuteInsert()
{
return !string.IsNullOrEmpty(Error);
}
Показать InsertCommand, как он был инициализирован, и его CanExecute –
@lll Добавил его в конец. –