Skip to content

Валидация данных

Редакторы 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, гарантирует, что валидация вызывается всякий раз, когда нажимается символ.

editors-validation-validate-event-example

<mxe:TextEditor x:Name="textEditor3" 
                ValidateOnInput="true"
                Validate="textEditorValidate"/>
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. Если значение выходит за пределы этого диапазона, редактор выводит сообщение об ошибке.

texteditor-validation-dataannotation-rangeattribute-example

<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.

editors-validation-inotifydataerrorinfo-example

<mxe:TextEditor x:Name="textEditor2" EditorValue="{Binding 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, редактор отображает значок ошибки в поле редактирования. Когда пользователь наводит курсор на значок, появляется всплывающая подсказка с описанием ошибки.

texteditor-errorshowmode-inplace

Показать ошибку редактора ниже

Установите для свойства ErrorShowMode значение Full, чтобы отобразить описание ошибки под полем редактирования. Значок встроенной ошибки в этом случае скрыт.

texteditor-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, чтобы получить текст ошибки.



* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.