Проверка данных
Avalonia предлагает различные варианты проверки данных. В этом разделе мы покажем вам, как вы можете проверить Properties
вашей ViewModel
и как вы можете стилизовать отображаемое сообщение об ошибке.
Проверка свойства
Avalonia использует DataValidationPlugins для проверки свойств, к которым вы привязаны. Из коробки Avalonia предоставляет эти три плагина проверки:
- DataAnnotations — ValidationPlugin
- INotifyDataErrorInfo — ValidationPlugin
- Exception — ValidationPlugin
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(); }