【问题标题】:Validate a datagrid in wpf在 wpf 中验证数据网格
【发布时间】:2015-07-10 14:12:20
【问题描述】:

我尝试验证数据网格以禁用或启用保存按钮。
我希望在后面的代码中能够知道我的数据网格中是否有错误。为此,我找到了一个让我知道我的 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;
}

我在后面的代码中绑定了事件BeginningEditCellEditEnding

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");
    }

}  

所以诀窍是在用户输入为假的基础上开始,并使保存按钮无效。

当用户完成编辑后,我可以(也许)启用保存按钮。

问题在于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)'

所以,在验证之前,我的数据网格是有效的。并在验证后抛出异常(预期行为)。

如何实现我想要的? 验证后是否会引发其他事件?

【问题讨论】:

  • 您可以尝试 CellValueChanged,这应该仅在单元格值更改后运行,等待验证。
  • 很遗憾,CellValueChanged 不存在...

标签: c# wpf validation datagrid


【解决方案1】:

将此代码添加到CellEditEnd event

((DataGrid)sender).Dispatcher.BeginInvoke((Action)delegate ()
{
    try
    {
        // Code
    }
    catch (InvalidOperationException) { }
    catch (Exception ex) { throw ex; }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2013-04-04
    • 2020-06-14
    • 2013-04-19
    • 2011-05-18
    • 2013-11-24
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多