WPF DataGrid自动生成列单元格验证及非法值样式设置方法
实现方案
1. 修改DataGrid XAML配置
移除原有行验证规则,添加列自动生成事件,同时修改单元格样式增加验证错误触发器,不会覆盖你原有的tableCellTheme样式:
<DataGrid Grid.Row="2" Margin="5" Background="Transparent" MaxHeight="300" MaxWidth="500" ScrollViewer.CanContentScroll="True" HorizontalAlignment="Center" VerticalAlignment="Center" ItemsSource="{Binding DataTable}" HeadersVisibility="None" CanUserAddRows="False" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"> <DataGrid.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource tableCellTheme}"> <Style.Triggers> <!-- 验证失败时自动设置单元格背景为红色,可根据需要修改为文字红色、边框红色等 --> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="Background" Value="Red"/> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> </DataGrid>
2. 编写单元格验证规则
自定义继承自ValidationRule的单元格校验逻辑,可根据不同列、不同数据类型定制校验规则:
using System.Globalization; using System.Windows.Controls; public class DataGridCellValidationRule : ValidationRule { // 当前校验的列名,可用于区分不同列做不同校验 public string ColumnName { get; set; } public DataGridCellValidationRule(string columnName) { ColumnName = columnName; } public override ValidationResult Validate(object value, CultureInfo cultureInfo) { // 示例1:通用非空校验 if (value == null || string.IsNullOrWhiteSpace(value.ToString())) { return new ValidationResult(false, "值不能为空"); } // 示例2:指定列的特殊校验,比如Age列必须是正整数 // if (ColumnName == "Age" && (!int.TryParse(value.ToString(), out int age) || age < 0)) // { // return new ValidationResult(false, "年龄必须为正整数"); // } return ValidationResult.ValidResult; } }
3. 实现自动生成列事件逻辑
给所有自动生成的列绑定添加验证规则,开启验证通知:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { if (e.Column is DataGridBoundColumn boundColumn && boundColumn.Binding is Binding binding) { // 开启验证错误通知 binding.NotifyOnValidationError = true; binding.ValidatesOnExceptions = true; // 为当前列绑定添加自定义验证规则 binding.ValidationRules.Add(new DataGridCellValidationRule(e.PropertyName)); } }
可选优化:复用DataTable内置约束
如果你绑定的DataTable本身已经定义了列约束(比如非空、长度限制、数据类型限制),不需要额外编写自定义ValidationRule,只需要在上述事件代码中给Binding添加binding.ValidatesOnDataErrors = true;即可,DataGrid会自动捕获DataTable的列级错误触发红色样式。
内容的提问来源于stack exchange,提问作者Sim
相关产品推荐
相关产品推荐

