WPF xaml:如何使用自动生成的列验证 DataGrid 中的单元格

Posted

技术标签:

【中文标题】WPF xaml:如何使用自动生成的列验证 DataGrid 中的单元格【英文标题】:WPF xaml: How to validate Cells in DataGrid with automatically generated Columns 【发布时间】:2021-12-29 06:20:45 【问题描述】:

如果值无效,如何在自动生成的 DataGrid(来自 DataTable)中添加单元格验证并将单元格设置为红色?

这是我的数据网格:

    <DataGrid Grid.Row="2"
              Margin="5"
              Background="Transparent"
              MaxHeight="300"
              MaxWidth="500"
              ScrollViewer.CanContentScroll="True"
              HorizontalAlignment="Center"
              VerticalAlignment="Center"
              ItemsSource="Binding DataTable"
              HeadersVisibility="None"
              CellStyle="StaticResource tableCellTheme"
              CanUserAddRows="False">

我也加了

        <DataGrid.RowValidationRules>
            <validation:DataGridValidation ValidationStep="UpdatedValue" />
        </DataGrid.RowValidationRules>

但我不想评估整行,更重要的是,如果返回 false,我不知道如何将违规单元格设置为红色... 感谢您的帮助!

【问题讨论】:

【参考方案1】:

您必须处理DataGrid.AutoGeneratingColumn 事件,获取对列绑定的引用,然后启用绑定验证并将ValidationRule 附加到它:

MainWindow.xaml

<DataGrid AutoGeneratingColumn="EnableCellValidation_OnAutoGeneratingColumn" />

MainWindow.xaml.cs

private void EnableCellValidation_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)

  if (e.Column is DataGridBoundColumn column)
  
    var columnBinding = column.Binding as Binding;
    columnBinding.ValidatesOnDataErrors = true;
    columnBinding.ValidationRules.Add(new DataGridValidation());
  

【讨论】:

谢谢,这对我有帮助!然而,。验证仅在输入数字时有效,如果我输入字符,则不会调用验证方法。你知道为什么吗?分别,如何解决这个问题?此外,在我的对角线上,我有文本而不是行名和列名(因为我的数据表是对称的)。我可以将这些单独的单元格设置为不可编辑吗?谢谢你的帮助!附:你是从哪里学到这些东西的?很容易找到 c# 的好资源,但不知何故我在学习 xaml 时遇到了困难...... 绑定验证未检测到输入。因此,它不区分数字和字母输入。输入只是传递给 ValidationRule.Validate 方法。如果没有按预期执行,您必须检查规则的实施。为防止特定单元格可编辑,您必须处理 DataGrid.BeginningEdit 事件并将事件 args 对象设置为取消以避免进入编辑模式。 给自己找一个小项目。这是应用您从阅读中学到的知识的最佳方式。您还会遇到问题,解决后会提高您的知识(经验)。

以上是关于WPF xaml:如何使用自动生成的列验证 DataGrid 中的单元格的主要内容,如果未能解决你的问题,请参考以下文章

禁用 WPF MVVM 中 DataGrid 中自动生成的列的排序

如何隐藏 WPF DataGrid 中的列标题?

在 WPF/xaml 中设置静态日期时间

在 WPF/xaml 中设置静态日期时间

WPF用XamlReader去Load一个XAML文件的时候报错,怎么回事?

如何在VS2012中使用IL Disassembler中查看项目编译生成的程序集