我有一个DataTable,我将它绑定到WPF中的DataGrid。XAML中不生成列,所有操作都是在代码中创建DataTable时完成的。
我有双向绑定,所以用户可以更新DataGrid中的值,它将更新DataTable,尽管这不是我在调试时看到的事件,但我的结果显示它按预期工作。
但是,如果列的类型是double,并且用户输入文本,则该单元格的现有DataTable数据将被保留,该单元格将以红色显示,并且我的调试器输出显示发生FormatException。
我想做的是能够:
a) 处理此异常并在我的UI 中向用户显示警告
b) 有一些自定义的验证方法,可以在我的代码中设置一个标志,我可以在某个时候使用它来处理错误
我不介意使用哪种解决方案,我只是不希望用户没有注意到错误。
谢谢。
如果你想继续使用ado.net和数据表,那么:http://msdn.microsoft.com/en-us/library/1120xds5.aspx
编辑:
this.MyTable.ColumnChanging += MyTableColumnChangingStuff;
private void MyTableColumnChangingStuff(object sender, DataColumnChangeEventArgs e)
{
if(e.Column.ColumnName == "MyColumnTestName")
{
var errormsg = MyValidateTestNameMethod(e.ProposedValue);
e.Row.SetColumnError(e.Column.ColumnName, errormsg);
}
//...
}
编辑2:
谢谢,只是尝试了一下,虽然活动在什么时候被召集我修改了正确类型的数据,如果用户输入的数据类型错误。和以前一样,盒子突出显示为红色,格式异常由wpf处理,但未调用事件。
这是真的。对我来说只有两个解决方案。首先为输入控件创建行为,确保值始终可以转换为您的底层类型。另一个解决方案是您的视图模型,在该模型中,您绑定到的只是字符串类型的属性。这样做的好处是,您永远不会因为类型转换而得到bindingexception。现在您要做的是在检查字符串属性的地方实现IDataErrorInfo。当然,当您进入模型时,您必须将字符串值强制转换为正确的类型。
到目前为止,我使用第一种方法,因为我使用日期选择器、数字行为,并且没有任何其他类型。