我正在使用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();
任何帮助将不胜感激。
答案 0 :(得分:0)
首先必须设置数据网格的当前单元格,然后调用BeginEdit方法以使键盘焦点位于该单元格内。
dataGrid1.Focus();
DataGridCellInfo cellInfo = new DataGridCellInfo(itemCollection2.First(), dataGrid1.Columns[0]);
dataGrid1.CurrentCell = cellInfo;
dataGrid1.ScrollIntoView(itemCollection2.First());
dataGrid1.BeginEdit();
我已经对此进行了测试,并且可以正常工作,刷新网格项目后,首先将焦点设置到网格上。
PS:请按照上述方法调用顺序进行操作。