Валидация данных¶
Редакторы Eremex поддерживают следующие подходы к валидации данных, которые обеспечивают корректный ввод данных, проверку значений и отображение ошибок для недопустимых данных:
- Маски — Позволяют указать шаблон, который ограничивает ввод данных пользователями в текстовых редакторах.
- Валидация данных на уровне редактора с использованием события
BaseEditor.Validate
. - Валидация данных на уровне привязанного объекта с использованием атрибутов
DataAnnotation
и интерфейсаINotifyDataErrorInfo
.
В этом разделе приведены более подробные сведения о валидации данных в редакторах Eremex.
Чтобы узнать больше о валидации данных в контролах-контейнерах, ознакомьтесь со следующим разделом:
Автоматическая валидация¶
Редакторы Eremex поддерживают автоматическую валидацию значений, которые вводит пользователь. Автоматическая валидация проверяет значение редактора на соответствие маске , если таковая имеется. Если редактор привязан к свойству, механизм валидации также выполняет следующее:
- Проверяет атрибуты проверки подлинности
DataAnnotation
, примененные к свойству. - Проверяет ошибки, созданные с помощью интерфейса
INotifyDataErrorInfo
. - Проверяет, может ли введенное значение быть преобразовано в тип данных привязанного свойства.
Валидация данных вызывается в следующих случаях:
- Значение редактора обновляется в коде.
- Когда редактор вот-вот потеряет фокус.
- Пользователь вводит любой символ при условии, что свойству
BaseEdit.ValidateOnInput
присвоено значениеtrue
(значение по умолчанию). - Пользователь нажимает клавишу
Enter
при условии, что для опцииBaseEdit.ValidateOnInput
установлено значениеfalse
.
Принудительная валидация данных¶
В определенных случаях вы можете захотеть принудительно вызвать механизм валидации для редактора. Для этой цели используйте метод BaseEditor.DoValidate
.
Валидация данных на уровне редактора¶
Событие "Проверка"¶
Событие BaseEditor.Validate
позволяет выполнять валидацию данных на уровне редактора в коде. Доступны следующие аргументы события:
ValidationEventArgs.Value
— Возвращает текущее значение.ValidationEventArgs.ErrorContent
— Позволяет указать ошибку, если текущее значение является недопустимым. Если для свойстваErrorContent
задано значениеnull
, текущее значение считается допустимым.
Пример - Убедитесь, что введенное значение является действительным адресом электронной почты¶
В следующем примере обрабатывается событие BaseEditor.Validate
, чтобы проверить, является ли строка, введенная в текстовом редакторе, действительным адресом электронной почты. Опция 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'¶
Следующий пример привязывает текстовый редактор к свойству NickName, определенному в классе MainViewModel. Класс MainViewModel реализует интерфейс INotifyDataErrorInfo
, который определяет три правила валидации для свойства NickName. Текстовый редактор выводит сообщение об ошибке, если метод 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
, чтобы получить текст ошибки.
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.