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

Avalonia DataGrid绑定/验证失败后隐藏或自定义异常提示

Avalonia DataGrid Decimal字段自定义绑定验证提示解决方案

方案1:自定义绑定验证规则

直接在DataGrid列的绑定中添加自定义验证规则,拦截非法输入并返回友好提示:

  1. 定义验证规则类:
using Avalonia.Controls;
using System.Globalization;

public class DecimalValidationRule : ValidationRule
{
    public string ErrorMessage { get; set; } = "请输入有效的数字";

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var input = value?.ToString().Trim();
        if (string.IsNullOrEmpty(input))
        {
            // 空值可交由INotifyDataErrorInfo处理,或在此添加逻辑
            return ValidationResult.ValidResult;
        }

        if (!decimal.TryParse(input, out _))
        {
            return new ValidationResult(false, ErrorMessage);
        }

        return ValidationResult.ValidResult;
    }
}
  1. 在XAML中应用规则:
<DataGridTextColumn Header="金额" 
                    Binding="{Binding Amount, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
    <DataGridTextColumn.Binding.ValidationRules>
        <local:DecimalValidationRule ErrorMessage="请输入有效的数字金额"/>
    </DataGridTextColumn.Binding.ValidationRules>
</DataGridTextColumn>

设置UpdateSourceTrigger=PropertyChanged可实现实时验证,输入非法值时会立即显示自定义提示,替代默认的InvalidCastException信息。

方案2:自定义类型转换器+异常验证

通过自定义转换器处理类型转换,失败时抛出友好异常,结合绑定的异常验证显示提示:

  1. 实现类型转换器:
using Avalonia.Data.Converters;
using System;
using System.Globalization;

public class DecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value?.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var input = value?.ToString().Trim();
        if (string.IsNullOrEmpty(input))
        {
            return null; // 或返回0m,根据业务需求调整
        }

        if (!decimal.TryParse(input, out var result))
        {
            // 抛出带友好信息的异常,绑定会捕获并显示
            throw new FormatException("请输入有效的数字");
        }

        return result;
    }
}
  1. 在XAML中配置转换器和绑定:
<Window.Resources>
    <local:DecimalConverter x:Key="DecimalConverter"/>
</Window.Resources>

<DataGridTextColumn Header="金额" 
                    Binding="{Binding Amount, 
                                     Converter={StaticResource DecimalConverter},
                                     UpdateSourceTrigger=PropertyChanged,
                                     ValidatesOnExceptions=True}"/>

此方案通过转换器拦截转换失败场景,抛出的友好异常会被绑定的ValidatesOnExceptions=True捕获,替换原始的InvalidCastException提示。

方案3:结合INotifyDataErrorInfo处理转换失败

如果希望完全通过INotifyDataErrorInfo统一管理验证,需先通过转换器将非法输入转为可识别的标记值,再在模型中验证:

  1. 转换器返回null作为非法输入标记:
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    var input = value?.ToString().Trim();
    if (string.IsNullOrEmpty(input) || !decimal.TryParse(input, out var result))
    {
        return null;
    }
    return result;
}
  1. 模型属性改为可空decimal,并在属性变更时触发验证:
private decimal? _amount;
public decimal? Amount
{
    get => _amount;
    set
    {
        if (_amount != value)
        {
            _amount = value;
            OnPropertyChanged();
            ValidateAmount();
        }
    }
}

private void ValidateAmount()
{
    ClearErrors(nameof(Amount));
    if (!Amount.HasValue)
    {
        AddError(nameof(Amount), "请输入有效的数字");
    }
    // 其他业务验证逻辑(如空值、范围检查等)
}
  1. 确保INotifyDataErrorInfo的实现正确维护错误集合,绑定设置ValidatesOnDataErrors=True即可显示自定义提示。

内容的提问来源于stack exchange,提问作者Mikhail Kriseev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:26