#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;
}