Как узнать, когда состояние проверки изменилось в wpf?

#c# #wpf #validation #mvvm #error-handling

Вопрос:

Привет есть приложение, которое использует MVVM , есть 3 текстовые поля в XAML, все из которых должны быть не null, и есть кнопка отправки внизу, я уже реализовал валидатор, так что текстовое поле показывает, что ошибка в интерфейсе с красной каймой, когда они не пустые, то, что я хочу, а также отключить кнопку, когда текстовое поле находится в состоянии ошибки

Один из подходов, который я пытался реализовать IDataErrorInfo , заключается в следующем

 #region IDataErrorInfo Members

        public string Error
        {
            get { return null; }
        }

        public string this[string propertyName]
        {
            get
            {
                //Code here to manually disable the submit button, if the fields are empty
                return null;
            }
        }
#endregion
 

Я могу вручную проверить, пусты ли текстовые поля, поскольку они привязаны к свойствам, и я также могу использовать свойство для привязки isEnabled атрибута кнопки «Отправить» таким же образом, но метод IDataErrorInfo просто не срабатывает при каждом изменении статуса проверки.

В принципе, я не могу позволить методу, стоящему за отправкой, выполняться, если форма не является действительной, и делать это таким образом, чтобы не нарушать правила

Ответ №1:

Убедитесь, что привязка для ваших текстовых полей поддерживает изменения статуса проверки:

 <TextBox Text="{Binding MyProperty, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True}"
<Button Content="Submit" Command="{Binding SubmitCommand}"
 

Определите свою команду, чтобы включить метод CanExecute:

 public ICommand SubmitCommand
{
    get
    {
        return _submitCommand ?? (_submitCommand = new RelayCommand(ExecuteSubmitCommand, CanExecuteSubmitCommand));
    }
}
 

Добавьте этот дополнительный вызов в сеттер вашего свойства _submitCommand?.RaiseCanExecuteChanged();

 public string MyProperty
{
    get { return _myProperty; }
    set
    {
        _myProperty = value;
        OnPropertyChanged(nameof(MyProperty));
        _submitCommand?.RaiseCanExecuteChanged();
    }
}
 

Затем в вашей модели представления проверьте свои значения и сохраните результат их проверки в некоторых полях bool:

 public string this[string propertyName]
{
    get
    {
        if (propertyName == nameof(MyProperty))
        {
            _isValidMyProperty = !string.IsNullOrWhiteSpace(MyProperty);
            if (!_isValidMyProperty )
            {
                return "Invalid value";
            }
        }
        return null;
    }
}
 

В методе CanExecute возвращайте, может ли команда Submit быть выполнена или нет. Кнопка будет автоматически включена/отключена в зависимости от наличия команды:

 private bool CanExecuteSubmitCommand()
{            
    return _isValidMyProperty;
}