如何在任何一个单元格中获取一些验证错误后编辑datagrid中的行

时间:2014-09-26 10:31:53

标签: wpf datagrid

我正在使用DataGrid来显示/编辑数据。我想允许用户编辑多行,尽管其中一些行可能有验证错误。现在,如果某行有验证错误,我无法编辑其他行。我看到了一个解决方案,我需要使用反射来获取DataGrid的一些属性。有更好,更清洁的方法吗?

2 个答案:

答案 0 :(得分:4)

您可以自定义datagrid并覆盖其OnCanExecuteBeginEdit事件,如下所示:

protected override void OnCanExecuteBeginEdit(System.Windows.Input.CanExecuteRoutedEventArgs e)
    {
        var hasCellValidationError = false;
        var hasRowValidationError = false;
        const BindingFlags bindingFlags =
            BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance;
        //Current cell
        var cellErrorInfo = this.GetType().BaseType.GetProperty("HasCellValidationError", bindingFlags);
        //Grid row
        var rowErrorInfo = this.GetType().BaseType.GetProperty("HasRowValidationError", bindingFlags);
        if (cellErrorInfo != null) hasCellValidationError = (bool) cellErrorInfo.GetValue(this, null);
        if (rowErrorInfo != null) hasRowValidationError = (bool) rowErrorInfo.GetValue(this, null);
        base.OnCanExecuteBeginEdit(e);
        if ((!e.CanExecute && hasCellValidationError) || (!e.CanExecute && hasRowValidationError))
        {
            e.CanExecute = true;
            e.Handled = true;
        }
 }

它检查datagrid是否有验证错误,然后设置其e.CanExecute = true,这样您就可以输入其他单元格。

答案 1 :(得分:0)

将CellEditEnding属性添加到datagrid

CellEditEnding="DataGridCellEditEnding"
实施方法

private void DataGridCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
  e.Cancel = true;
}