Avalonia DataGrid绑定/验证失败后隐藏或自定义异常提示
Avalonia DataGrid Decimal字段自定义绑定验证提示解决方案
方案1:自定义绑定验证规则
直接在DataGrid列的绑定中添加自定义验证规则,拦截非法输入并返回友好提示:
- 定义验证规则类:
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; } }
- 在XAML中应用规则:
<DataGridTextColumn Header="金额" Binding="{Binding Amount, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"> <DataGridTextColumn.Binding.ValidationRules> <local:DecimalValidationRule ErrorMessage="请输入有效的数字金额"/> </DataGridTextColumn.Binding.ValidationRules> </DataGridTextColumn>
设置UpdateSourceTrigger=PropertyChanged可实现实时验证,输入非法值时会立即显示自定义提示,替代默认的InvalidCastException信息。
方案2:自定义类型转换器+异常验证
通过自定义转换器处理类型转换,失败时抛出友好异常,结合绑定的异常验证显示提示:
- 实现类型转换器:
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; } }
- 在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统一管理验证,需先通过转换器将非法输入转为可识别的标记值,再在模型中验证:
- 转换器返回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; }
- 模型属性改为可空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), "请输入有效的数字"); } // 其他业务验证逻辑(如空值、范围检查等) }
- 确保
INotifyDataErrorInfo的实现正确维护错误集合,绑定设置ValidatesOnDataErrors=True即可显示自定义提示。
内容的提问来源于stack exchange,提问作者Mikhail Kriseev
相关产品推荐
相关产品推荐

