Валидация данных¶
Редакторы Eremex поддерживают следующие подходы к валидации данных, которые обеспечивают корректный ввод данных, проверку значений и отображение ошибок для недопустимых данных:
- Маски — позволяют задать шаблон, ограничивающий ввод данных пользователями в текстовых редакторах.
- Валидация данных на уровне редактора с помощью события
BaseEditor.Validate. - Валидация данных на уровне привязанного объекта с помощью атрибутов
DataAnnotationи интерфейсаINotifyDataErrorInfo.
В этом разделе подробнее рассматривается валидация данных в редакторах Eremex.
Чтобы узнать о валидации данных в контейнерных контролах, смотрите следующий раздел:
Автоматическая валидация¶
Редакторы Eremex поддерживают автоматическую валидацию значений, которые вводит пользователь. Автоматическая валидация проверяет значение редактора по маске, если она задана. Если редактор привязан к свойству, механизм валидации также делает следующее:
- Проверяет атрибуты валидации
DataAnnotation, применённые к свойству. - Проверяет ошибки, созданные с помощью интерфейса
INotifyDataErrorInfo. - Проверяет, можно ли преобразовать введённое значение в тип данных привязанного свойства.
Валидация данных вызывается в следующих случаях:
- Значение редактора обновляется в коде.
- Когда редактор собирается потерять фокус.
- Пользователь вводит любой символ при условии, что свойство
BaseEdit.ValidateOnInputустановлено вtrue(значение по умолчанию). - Пользователь нажимает клавишу
Enterпри условии, что опцияBaseEdit.ValidateOnInputустановлена вfalse.
Принудительная валидация данных¶
В определённых случаях вам может потребоваться принудительно вызвать механизм валидации для редактора. Используйте для этого метод BaseEditor.DoValidate.
Валидация данных на уровне редактора¶
Событие 'Validate'¶
Событие BaseEditor.Validate позволяет выполнять валидацию данных на уровне редактора в code-behind. Доступны следующие аргументы события:
ValidationEventArgs.Value— возвращает текущее значение.ValidationEventArgs.ErrorContent— позволяет задать ошибку, если текущее значение недопустимо. Если вы оставите свойствоErrorContentустановленным вnull, текущее значение считается допустимым.
Пример - проверка того, что введённое значение является допустимым адресом электронной почты¶
Следующий пример обрабатывает событие BaseEditor.Validate, чтобы проверить, что строка, введённая в Text Editor, является допустимым адресом электронной почты. Опция ValidateOnInput, установленная в true, обеспечивает вызов валидации при каждом нажатии символа.
private void textEditorValidate(object sender, Eremex.AvaloniaUI.Controls.Editors.ValidationEventArgs e)
{
if(e.Value == null || !IsEmailAddress(e.Value.ToString()))
{
e.ErrorContent = "Please enter a valid e-mail address";
}
}
bool IsEmailAddress(string email)
{
Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
Match match = regex.Match(email);
return match.Success;
}
Валидация данных на уровне привязанного объекта¶
Валидация данных с помощью атрибутов DataAnnotation¶
Вы можете использовать атрибуты валидации DataAnnotations (потомки System.ComponentModel.DataAnnotations.ValidationAttribute), чтобы создать правило валидации для свойства бизнес-объекта. При привязке к этому свойству редактор Eremex автоматически проверяет правило допустимости данных, заданное этим атрибутом.
Список ниже показывает наиболее распространённые атрибуты валидации:
CompareAttribute— предоставляет атрибут, сравнивающий два свойства.CustomValidationAttribute— задаёт пользовательский метод валидации, используемый для проверки свойства или экземпляра класса.MaxLengthAttribute— задаёт максимальную длину массива или строковых данных, допустимую в свойстве.MinLengthAttribute— задаёт минимальную длину массива или строковых данных, допустимую в свойстве.RangeAttribute— задаёт числовые ограничения диапазона для значения поля данных.RegularExpressionAttribute— задаёт, что значение поля данных должно соответствовать заданному регулярному выражению.RequiredAttribute— задаёт, что значение поля данных обязательно.StringLengthAttribute— задаёт минимальную и максимальную длину символов, допустимую в поле данных.
Пример - валидация с помощью 'RangeAttribute'¶
Следующий пример использует атрибут RangeAttribute, чтобы обеспечить, что значение свойства находится в диапазоне от 10 до 100. Редактор отображает ошибку, если значение выходит за этот диапазон.
<mxe:TextEditor x:Name="textEditor1"
Grid.Row="1"
HorizontalContentAlignment="Right"
EditorValue="{Binding Capacity}" />
public partial class MyViewModel : ObservableObject
{
[ObservableProperty]
[property: Range(10, 100, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
int capacity;
}
Валидация данных с помощью интерфейса 'INotifyDataErrorInfo'¶
Интерфейс System.ComponentModel.INotifyDataErrorInfo позволяет реализовать пользовательские правила валидации на уровне бизнес-объекта. Интерфейс поддерживает синхронную и асинхронную валидацию, несколько ошибок на свойство и межсвойственные ошибки.
Пример - реализация интерфейса 'INotifyDataErrorInfo'¶
Следующий пример привязывает Text Editor к свойству NickName, определённому в классе MainViewModel. Класс MainViewModel реализует интерфейс INotifyDataErrorInfo, определяющий три правила валидации для свойства NickName. Text Editor отображает ошибку, если метод INotifyDataErrorInfo.GetErrors возвращает ошибку (ошибки) для свойства NickName.
public partial class MainViewModel : ObservableObject, INotifyDataErrorInfo
{
private Dictionary<string, List<string>> propertyErrors = new Dictionary<string, List<string>>();
[ObservableProperty]
public string nickName;
partial void OnNickNameChanged(string oldValue, string newValue) => ValidateNickName();
public bool HasErrors => propertyErrors.Any();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public IEnumerable GetErrors(string propertyName)
{
if (propertyErrors.ContainsKey(propertyName))
return propertyErrors[propertyName];
else
return null;
}
private void RaiseErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
private void ValidateNickName()
{
ClearErrors(nameof(NickName));
if (string.IsNullOrEmpty(NickName))
AddError(nameof(NickName), "Nick Name cannot be empty.");
if (string.Equals(NickName, "user", StringComparison.OrdinalIgnoreCase))
AddError(nameof(NickName), "Invalid Nick Name: 'user'");
if (NickName == null || NickName?.Length <= 5)
AddError(nameof(NickName), "The string is too short");
}
private void AddError(string propertyName, string error)
{
if (!propertyErrors.ContainsKey(propertyName))
propertyErrors[propertyName] = new List<string>();
if (!propertyErrors[propertyName].Contains(error))
{
propertyErrors[propertyName].Add(error);
RaiseErrorsChanged(propertyName);
}
}
private void ClearErrors(string propertyName)
{
if (propertyErrors.ContainsKey(propertyName))
{
propertyErrors.Remove(propertyName);
RaiseErrorsChanged(propertyName);
}
}
public MainViewModel()
{
//...
NickName = "user";
}
}
Индикация ошибок¶
Когда во время валидации данных возникает ошибка, редактор индицирует ошибку в соответствии со свойством BaseEditor.ErrorShowMode. Поддерживаются два режима отображения ошибок:
Показ встроенного значка ошибки и всплывающей подсказки¶
Если свойство ErrorShowMode установлено в Inplace, редактор отображает значок ошибки внутри поля ввода. Когда пользователь наводит курсор на значок, появляется всплывающая подсказка с описанием ошибки.
Показ ошибки под редактором¶
Установите свойство ErrorShowMode в Full, чтобы отобразить описание ошибки под полем ввода. Встроенный значок ошибки в этом случае скрыт.
Установка и очистка текста ошибки¶
Чтобы задать текст ошибки, вы можете выполнить одно из следующих действий:
-
Обработать событие
BaseEditor.Validateи установить аргумент событияErrorContent. Ошибка не применяется, если вы оставите аргумент событияErrorContentустановленным вnull.Чтобы принудительно инициировать событие
BaseEditor.Validate, вызовите методBaseEditor.DoValidate. -
Задать ошибку с помощью свойства
BaseEditor.ValidationInfo.Следующий код устанавливает ошибку для редактора, если значение редактора равно
nullили0.if(textEditor2.EditorValue == null || Convert.ToInt32(textEditor2.EditorValue)==0) textEditor2.ValidationInfo = new ValidationInfo("Invalid value");Установите свойство
BaseEditor.ValidationInfoвnull, чтобы очистить ошибку.
Получение текста ошибки¶
Используйте свойство BaseEditor.ErrorText, чтобы получить текст ошибки.
* Эта страница переведена с использованием технологий машинного перевода.




