Документация по Avalonia UI
< Все темы
Печать

Проверка данных

Avalonia предлагает различные варианты проверки данных. В этом разделе мы покажем вам, как вы можете проверить Properties вашей ViewModel и как вы можете стилизовать отображаемое сообщение об ошибке.

Проверка свойства

Avalonia использует DataValidationPlugins для проверки свойств, к которым вы привязаны. Из коробки Avalonia предоставляет эти три плагина проверки:

DataAnnotations — ValidationPlugin

Вы можете декорировать свойства вашей ViewModel различными атрибутами проверки. Вы можете использовать встроенные, использовать CustomValidationAttribute или создать свой собственный, производный от ValidationAttribute.

Пример: свойство EMail является обязательным и должно быть действительным адресом электронной почты.

[Required]
[EmailAddress]
public string? EMail
{
get { return _EMail; }
set { this.RaiseAndSetIfChanged(ref _EMail, value); }
}

INotifyDataErrorInfo — ValidationPlugin

Avalonia также поддерживает проверку классов, реализующих INotifyDataErrorInfo. Несколько MVVM-библиотек используют этот интерфейс для проверки своих данных, например, пакет Microsoft.Toolkit.Mvvm и пакет ReactiveUI.Validation. Инструкции по использованию см. в документации выбранного вами пакета MVVM.

Некоторые библиотеки, такие как Microsoft.Toolkit.Mvvm, используют для проверки DataAnnotiations . Это может привести к конфликтам с DataAnnotations — ValidationPlugin. См. Управление плагинами проверки, чтобы решить эту проблему.

Exception — ValidationPlugin

Еще один вариант проверки свойства — вызвать исключение внутри установщика вашего свойства.

Пример: проверка свойства EMail с помощью исключений

public string? EMail
{
    get { return _EMail; }
    set 
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentNullException(nameof(EMail), "This field is required");
        }
        else if (!value.Contains('@'))
        {
            throw new ArgumentException(nameof(EMail), "Not a valid E-Mail-Address");
        }
        else
        { 
            this.RaiseAndSetIfChanged(ref _EMail, value); 
        } 
    }
}

Исключения внутри геттера вашего свойства не допускаются и приведут к сбою вашего приложения.

Настройте внешний вид сообщения проверки

Для отображения сообщений проверки в Avalonia есть элемент управления DataValidationErrors. Этот элемент управления обычно размещается внутри ControlTemplate всех элементов управления, которые поддерживают проверку данных, таких как TextBox, Slider и другие. Вы можете создать свой собственный стиль элемента управления DataValidationErrors, чтобы настроить представление сообщений об ошибках.

Пример стиля для DataValidationErrors

<Style Selector="DataValidationErrors">
  <Setter Property="Template">
    <ControlTemplate>
      <DockPanel LastChildFill="True">
        <ContentControl DockPanel.Dock="Right"
                        ContentTemplate="{TemplateBinding ErrorTemplate}"
                        DataContext="{TemplateBinding Owner}"
                        Content="{Binding (DataValidationErrors.Errors)}"
                        IsVisible="{Binding (DataValidationErrors.HasErrors)}"/>
        <ContentPresenter Name="PART_ContentPresenter"
                          Background="{TemplateBinding Background}"
                          BorderBrush="{TemplateBinding BorderBrush}"
                          BorderThickness="{TemplateBinding BorderThickness}"
                          CornerRadius="{TemplateBinding CornerRadius}"
                          ContentTemplate="{TemplateBinding ContentTemplate}"
                          Content="{TemplateBinding Content}"
                          Padding="{TemplateBinding Padding}"/>
      </DockPanel>
    </ControlTemplate>
  </Setter>
  <Setter Property="ErrorTemplate">
    <DataTemplate>
      <Canvas Width="14" Height="14" Margin="4 0 1 0" 
              Background="Transparent">
        <Canvas.Styles>
          <Style Selector="ToolTip">
            <Setter Property="Background" Value="LightRed"/>
            <Setter Property="BorderBrush" Value="Red"/>
          </Style>
        </Canvas.Styles>
        <ToolTip.Tip>
          <ItemsControl Items="{Binding}"/>
        </ToolTip.Tip>
        <Path Data="M14,7 A7,7 0 0,0 0,7 M0,7 A7,7 0 1,0 14,7 M7,3l0,5 M7,9l0,2" 
              Stroke="Red" 
              StrokeThickness="2"/>
      </Canvas>
    </DataTemplate>
  </Setter>
</Style>

Пользовательский стиль проверки

 

Управление плагинами проверки

при необходимости вы можете включить или отключить определенный плагин ValidationPlugin в своем приложении. Это может быть полезно, если, например, ваша инфраструктура MVVM использует DataAnnotations для проверки свойства через INotifyDataErrorInfo. В этом случае вы увидите сообщение дважды. Используйте коллекцию ExpressionObserver.DataValidators, чтобы добавить или удалить конкретный модуль ValidationPlugin.

Пример: удаление валидатора DataAnnotations

public override void OnFrameworkInitializationCompleted()
{
    // Remove the DataAnnotations validator
    ExpressionObserver.DataValidators.RemoveAll(x => x is DataAnnotationsValidationPlugin);
    
    // Continue with normal startup
    if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
    {
        desktop.MainWindow = new MainWindow()
        {
            DataContext = MainWindowViewModel.Instance
        };
    }

    base.OnFrameworkInitializationCompleted();
}

 

Оглавление