0

我正在尝试验证由(例如)DataGrid填充的 a上的输入。但是,我看到的所有 WPF DataGrid 验证示例都假定源是 C# 类。我不知道如何将单个单元格(即一列)连接到代码隐藏验证。有人可以举个例子或指出一个例子吗?DataViewmyDataGrid.ItemsSource = myDataViewDataGrid

4

2 回答 2

0

好的,我做了一些快速测试;我认为真正手动执行此操作的主要障碍是 DataGridCell 在直接分配 DataView 进行显示时不会为其内容创建任何绑定。但是,如果您愿意在创建 DataGrid 时跳过分配自定义 DataGridTemplateColumns 的麻烦,您可以访问模板内的 TextBox 实例上的绑定,并在它们上设置自定义验证错误。

实际上,无论是这个还是覆盖 DataGrid 生成的文本框的默认样式;您会看到,默认文本框样式没有任何边框或任何内容,因此对其设置验证错误没有任何效果。使用 DataTemplate 将其变为普通文本框或覆盖其样式将使您能够实际使某些内容可见,作为设置验证错误的效果。

但是,您需要自己做一些研究;我做了一个快速原型并且它可以工作,但是我无法在 DataTemplate 中正确创建绑定(或者我忘记了自上次使用它以来我所知道的所有 WPF,或者我只知道如何使用正确的绑定:)) . 如果你得到某个地方,那么前进会更容易:

以某种方式访问​​ BindingExpression;我所做的是将处理程序附加到 LostFocus 事件并检查丢失的焦点是否是 DataGridCell 内的文本框;如果是这样,我只是将该绑定标记为无效(t代表一个 TextBox 实例):

var x = t.GetBindingExpression(TextBox.TextProperty);

Validation.MarkInvalid(x, new ValidationError(new ExceptionValidationRule(), x.ParentBinding, "error", new Exception("error")));

我必须承认我不确定每个参数在 ValidationError 构造函数中的作用是什么(我认为异常消息默认显示在验证工具提示中?还是错误内容?),但我相信你可以想办法。现在,如果您不介意,我想我会休息一下……就像我说的那样,逆流而上并不容易:)

于 2013-03-13T00:13:30.607 回答
0

所以我做了更多的研究,我基本上缺少的是我可以用 a 的Path属性指定列名Binding(或者甚至使用括号中的列序号,例如 Path="[0]")。在实现之后,一切都与使用类属性基本相同。因此,我使用的典型DataGrid列定义如下:

<DataGridTextColumn Header="Regular" EditingElementStyle="{StaticResource ValidationErrorStyleBoxRA}" ElementStyle="{StaticResource ValidationErrorStyleBlockRA}" Width="60">
    <DataGridTextColumn.Binding>
        <Binding Path="HourlyRate" StringFormat="F3" ValidatesOnExceptions="True" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:HourlyRatesAmountValidate ValidatesOnTargetUpdated="True" />
            </Binding.ValidationRules>
        </Binding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>
于 2013-03-18T20:54:41.803 回答