C# 在wpf中验证数据网格
我尝试验证datagrid以禁用或启用保存按钮。C# 在wpf中验证数据网格,c#,wpf,validation,datagrid,C#,Wpf,Validation,Datagrid,我尝试验证datagrid以禁用或启用保存按钮。 在代码隐藏中,我希望能够知道我的datagrid中是否存在错误。为此,我发现了一个函数,可以让我知道我的datgrid是否有效: private bool HasError(DataGrid dg) { bool errors = (from c in (from object i in dg.ItemsSource select dg.ItemContainerGenerator.Container
在代码隐藏中,我希望能够知道我的datagrid中是否存在错误。为此,我发现了一个函数,可以让我知道我的datgrid是否有效:
private bool HasError(DataGrid dg)
{
bool errors = (from c in
(from object i in dg.ItemsSource
select dg.ItemContainerGenerator.ContainerFromItem(i))
where c != null
select Validation.GetHasError(c)
).FirstOrDefault(x => x);
return errors;
}
我将事件beginingedit
和CellEditEnding
绑定到我的代码隐藏中:
private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
((MainViewModel)this.DataContext).SubVM.SaveButtonIsEnabled = false;
}
private void dg_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
if (HasError(sender as DataGrid))
{
Console.WriteLine("Error");
}
else
{
((MainViewModel)this.DataContext).SubVM.SaveButtonIsEnabled = true;
Console.WriteLine("Ok");
}
}
因此,诀窍是在用户输入为false的基础上启动并使save按钮无效
当用户完成编辑后,我可以(可能)启用保存按钮
问题在于,CellEditEnding
在验证之前被提出
Ok
System.Windows.Data Error: 7 : ConvertBack cannot convert value '-78.2' (type 'String'). BindingExpression:Path=Version; DataItem='Reference' (HashCode=64396947); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException
à System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
à System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
à System.String.System.IConvertible.ToUInt32(IFormatProvider provider)
à System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
à MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
à System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'
因此,在验证之前,我的datagrid是有效的。验证后会引发异常(exptected行为)
如何实现我想要的?
验证后是否会引发其他事件?将此代码添加到
CellEditEnd事件中
((DataGrid)sender).Dispatcher.BeginInvoke((Action)delegate ()
{
try
{
// Code
}
catch (InvalidOperationException) { }
catch (Exception ex) { throw ex; }
});
您可以改为尝试CellValueChanged,这应该只在单元格v值更改后运行,等待验证。不幸的是,CellValueChanged不存在。。。