WinUI3 Community Toolkit DataGrid的C#简易输入验证方案咨询
针对WinUI3 DataGrid简单输入校验的可行方案
方案1:利用CellEditEnding事件+列标签(你提出的思路)
这个方案完全可行,实现步骤如下:
给DataGrid列设置Tag属性:
在XAML定义列时,给对应列添加Tag标记数据类型,比如数字列设为"int",日期列设为"date":<controls:DataGridTextColumn Header="年龄" Binding="{Binding Age}" Tag="int" /> <controls:DataGridTextColumn Header="入职日期" Binding="{Binding HireDate}" Tag="date" />处理CellEditEnding事件:
在后台代码中订阅CellEditEnding事件,在事件里获取当前编辑列的标签和输入值,完成校验:private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { if (e.EditAction != DataGridEditAction.Commit) return; // 获取当前列的类型标记 var columnTypeTag = e.Column.Tag?.ToString(); if (string.IsNullOrEmpty(columnTypeTag)) return; // 获取编辑控件的输入内容 var textBox = e.EditingElement as TextBox; var inputValue = textBox?.Text?.Trim(); if (string.IsNullOrEmpty(inputValue)) return; bool isValid = true; switch (columnTypeTag) { case "int": isValid = int.TryParse(inputValue, out _); break; case "date": isValid = DateTime.TryParse(inputValue, out _); break; } // 校验不通过时取消提交并提示 if (!isValid) { e.Cancel = true; var tipContent = columnTypeTag switch { "int" => "请输入有效的整数", "date" => "请输入有效的日期格式", _ => "输入格式错误" }; _ = new ContentDialog { Title = "输入错误", Content = tipContent, CloseButtonText = "确定" }.ShowAsync(); } }
方案2:直接使用匹配类型的编辑控件(更简便)
如果只是基础类型校验,直接给列指定对应类型的编辑控件,从源头限制输入,比事后校验更友好:
数字列:用
NumericUpDown作为编辑控件,只能输入数字<controls:DataGridTemplateColumn Header="年龄"> <controls:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Age}" /> </DataTemplate> </controls:DataGridTemplateColumn.CellTemplate> <controls:DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <NumericUpDown Value="{Binding Age, Mode=TwoWay}" Minimum="0" Maximum="100" /> </DataTemplate> </controls:DataGridTemplateColumn.CellEditingTemplate> </controls:DataGridTemplateColumn>日期列:用
DatePicker或CalendarDatePicker,只能选择合法日期<controls:DataGridTemplateColumn Header="入职日期"> <controls:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding HireDate, StringFormat='yyyy-MM-dd'}" /> </DataTemplate> </controls:DataGridTemplateColumn.CellTemplate> <controls:DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <DatePicker Date="{Binding HireDate, Mode=TwoWay}" /> </DataTemplate> </controls:DataGridTemplateColumn.CellEditingTemplate> </controls:DataGridTemplateColumn>
是否必须用INotifyDataErrorInfo?
完全没必要。INotifyDataErrorInfo适合复杂的业务校验场景(比如字段间关联校验、异步校验),需要在模型层做全局验证时才用。对于你的简单类型校验需求,上面两种方案足够轻量且高效。
内容的提问来源于stack exchange,提问作者Rev1k
相关产品推荐
相关产品推荐

