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