刷新项目后如何在WPF DataGrid中恢复对单元格的关注

时间:2018-11-27 09:42:31

标签: c# wpf

我正在使用VS2015开发WPF应用程序。

为了验证WPF数据网格中具有最小值和最大值的列,我正在使用ValidationRule。

以下是ValidationRule的代码:

public class MinMaxValidationRule : System.Windows.Controls.ValidationRule
{
    /// <summary>
    /// Validates updated values and compares min and max values.
    /// </summary>
    /// <param name="value"></param>
    /// <param name="cultureInfo"></param>
    /// <returns></returns>
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        BindingExpression bindingExpr = value as BindingExpression;
        if (bindingExpr != null)
        {
            var item = bindingExpr.DataItem as XraySystemStructure;
            if (item != null &&
                item.countMandatory > item.countMax)
            {
                // The min value is bigger than the max value -> disables the save-button and displays error
                SaveButtonEnabled = false;
                return new ValidationResult(false, TextCountMandatoryBiggerThanCountMax);
            }

            // Validation is correct -> Refreshes the datagrid to remove all errors (multiple datagridcells)
            SaveButtonEnabled = true;
            grdSystemStructure.Items.Refresh();
        }

        // Validation is correct -> Remove all errors
        return new ValidationResult(true, null);
    }
}

在验证中,我正在检查countMandatory中的值是否大于countMax中的值。

如果countMandatory更大,这是一个错误。

在运行时,两个单元格都可能标记有验证错误,因为用户可以在countMax中输入一个小于countMandatory的值,这是错误的。

因此-为了在验证成功的情况下删除-所有验证错误,我必须对数据网格的所有项目进行刷新。

由于我失去了对数据网格的关注,因此用户必须单击该单元格才能在当前单元格中继续输入。

每个示例:

用户输入了countMandatory“ 2”和maxCount“ 1”。

maxCount列标记有验证错误。

然后用户想要将maxCount编辑为“ 111”,单击maxCount单元格并添加另一个“ 1”,这样maxCount现在为“ 11”,并且验证成功。

但是通过刷新项目,数据网格失去了焦点,用户必须在单元格中用鼠标单击才能继续最后一个对用户不友好的“ 1”。

如何恢复对当前单元格的关注? 我试图在刷新后设置SelectedItem和CurrentCell,但是它不起作用。

每个示例都不能解决我的问题的解决方案:

            grdSystemStructure.Items.Refresh();
            grdSystemStructure.ScrollIntoView(item, column);
            grdSystemStructure.CurrentCell = new DataGridCellInfo(selItem, column);
            grdSystemStructure.BeginEdit();
            grdSystemStructure.Focus();

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先必须设置数据网格的当前单元格,然后调用BeginEdit方法以使键盘焦点位于该单元格内。

dataGrid1.Focus();
DataGridCellInfo cellInfo = new DataGridCellInfo(itemCollection2.First(), dataGrid1.Columns[0]);
dataGrid1.CurrentCell = cellInfo;
dataGrid1.ScrollIntoView(itemCollection2.First());
dataGrid1.BeginEdit();

我已经对此进行了测试,并且可以正常工作,刷新网格项目后,首先将焦点设置到网格上。

PS:请按照上述方法调用顺序进行操作。