我正在尝试验证由(例如)DataGrid
填充的 a上的输入。但是,我看到的所有 WPF DataGrid 验证示例都假定源是 C# 类。我不知道如何将单个单元格(即一列)连接到代码隐藏验证。有人可以举个例子或指出一个例子吗?DataView
myDataGrid.ItemsSource = myDataView
DataGrid
2 回答
好的,我做了一些快速测试;我认为真正手动执行此操作的主要障碍是 DataGridCell 在直接分配 DataView 进行显示时不会为其内容创建任何绑定。但是,如果您愿意在创建 DataGrid 时跳过分配自定义 DataGridTemplateColumn
s 的麻烦,您可以访问模板内的 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 构造函数中的作用是什么(我认为异常消息默认显示在验证工具提示中?还是错误内容?),但我相信你可以想办法。现在,如果您不介意,我想我会休息一下……就像我说的那样,逆流而上并不容易:)
所以我做了更多的研究,我基本上缺少的是我可以用 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>