WPF DataGrid输入验证:如何适配字符串/整数类型输入
解决WPF DataGrid中1-20整数输入验证的问题
我来帮你搞定这个验证问题!你当前的代码有两个核心问题:一是错误地将Validate方法的value参数强转为BindingGroup(实际上在DataGridTextColumn场景下,这个参数是用户输入的原始字符串);二是没有处理输入非整数的情况,直接访问doel.Niveau可能会引发异常。
下面是修改后的完整解决方案:
修改后的C#验证规则代码
public class NiveautredeValidationRule : ValidationRule { // 明确指定验证步骤为原始输入值(默认就是这个,显式写出来更清晰) public override ValidationStep ValidationStep => ValidationStep.RawProposedValue; public override ValidationResult Validate(object value, CultureInfo cultureInfo) { // 先将输入值转为字符串,处理空输入的情况 string input = value?.ToString().Trim(); if (string.IsNullOrEmpty(input)) { return new ValidationResult(false, "Niveau不能为空!"); } // 尝试将字符串解析为整数,安全处理非数字输入 if (!int.TryParse(input, out int niveauValue)) { return new ValidationResult(false, "请输入有效的整数!"); } // 验证整数是否在1-20范围内 if (niveauValue < 1 || niveauValue > 20) { return new ValidationResult(false, "Niveau moet tussen de 1 en 20 zijn!"); } return ValidationResult.ValidResult; } }
为什么要这么修改?
- 正确处理输入值类型:
DataGridTextColumn的绑定在RawProposedValue阶段传递的是用户输入的原始字符串,而不是BindingGroup,所以我们直接对这个字符串进行处理即可。 - 安全的类型转换:用
int.TryParse替代直接强转,避免输入非数字时抛出异常,同时给出友好的错误提示。 - 覆盖所有异常场景:包括空输入、非整数输入、超出范围的整数输入,确保所有不符合要求的情况都能被捕获并提示。
可选的XAML调整(非必需)
如果你想更明确地指定验证时机,可以在XAML的ValidationRule中添加ValidationStep属性,不过默认就是RawProposedValue,所以不修改也没问题:
<DataGridTextColumn Header="Niveau"> <DataGridTextColumn.Binding> <Binding Path="Niveau" UpdateSourceTrigger="LostFocus"> <Binding.ValidationRules> <valRule:NiveautredeValidationRule ValidationStep="RawProposedValue"/> </Binding.ValidationRules> </Binding> </DataGridTextColumn.Binding> </DataGridTextColumn>
这样修改后,就能完美实现1-20的整数输入校验啦!
内容的提问来源于stack exchange,提问作者ivan franken
相关产品推荐
相关产品推荐

