绑定到DataView时的WPF DataGrid验证

时间:2013-03-12 20:10:58

标签: wpf validation wpfdatagrid dataview

我正在尝试验证由DataGrid填充的DataView上的输入(例如myDataGrid.ItemsSource = myDataView)。但是,我看到的所有WPF DataGrid验证示例都假设DataGrid源是C#类。我无法弄清楚如何将单个单元格(即列)连接到代码隐藏验证。有人可以给出一个例子或指向我吗?

2 个答案:

答案 0 :(得分:0)

好的,我做了一些快速测试;我认为真正手动执行此操作的主要障碍是,在直接分配DataView进行显示时,DataGridCell不会为其内容创建任何绑定。但是,如果您愿意在创建DataGrid时跳过分配自定义DataGridTemplateColumn的箍,则可以访问模板内的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构造函数中的作用是什么(我认为默认情况下在验证工具提示中显示异常消息?或者它是错误内容?),但我是确定你能搞清楚。现在如果你不介意的话,我想我会休息一下......就像我说的那样,反对这个流程并不容易:)

答案 1 :(得分:0)

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

DataGrid