You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:04:32