Avalonia自定义TemplatedControl数据验证异常:错误文本显示但内部TextBox无错误边框
Avalonia自定义TemplatedControl数据验证异常:错误文本显示但内部TextBox无错误边框
我在Avalonia中使用自定义的TemplatedControl,当把它的属性绑定到ViewModel时,数据验证会执行,但看不到完整的验证错误视觉效果。控件内部的TextBox能显示错误文本,不过错误边框却不显示。
Themes/Generic.axaml 代码:
<?xml version="1.0" encoding="utf-8"?> <Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Dashavalanche.UI.Controls"> <Style Selector="local|PathBox"> <Setter Property="Template"> <ControlTemplate> <DataValidationErrors> <TextBox Text="{Binding Path, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" Watermark="{TemplateBinding Watermark}" x:Name="PART_TextBox"/> </DataValidationErrors> </ControlTemplate> </Setter> </Style> </Styles>
Controls/PathBox.cs 代码:
using System; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Data; namespace Dashavalanche.UI.Controls; public class PathBox : TemplatedControl { public static readonly DirectProperty<PathBox, string?> PathProperty = AvaloniaProperty.RegisterDirect<PathBox, string?>( nameof(Path), o => o.Path, (o, v) => o.Path = v, defaultBindingMode: BindingMode.TwoWay, enableDataValidation: true); private string? _path; public string? Path { get => _path; set => SetAndRaise(PathProperty, ref _path, value); } public static readonly StyledProperty<string?> WatermarkProperty = AvaloniaProperty.Register<PathBox, string?>(nameof(Watermark)); public string? Watermark { get => GetValue(WatermarkProperty); set => SetValue(WatermarkProperty, value); } protected override void UpdateDataValidation(AvaloniaProperty property, BindingValueType state, Exception? error) { base.UpdateDataValidation(property, state, error); if (property == PathProperty) { DataValidationErrors.SetError(this, error); } } }
使用方式:
<local:PathBox Watermark="Откуда" Path="{Binding SourcePath, Mode=TwoWay}"/>
截图中,上方是PathBox,下方是普通的TextBox,两者绑定到带有相同数据验证的属性。

在DevTools的逻辑树和视觉树中,PathBox带有:error伪类,但内部的TextBox没有。
使用环境:Avalonia 11.3.12,.NET 8。
备注:内容来源于stack exchange,提问作者MrArsikk
相关产品推荐
相关产品推荐

