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