WPF DataGrid:在行验证错误后将焦点设置在特定单元格上

时间:2011-07-25 12:18:44

标签: wpf validation datagrid focus

我有一个带有RowValidationRules的WPF DataGrid。我想设置焦点或开始编辑特定的单元格,以防验证失败。

例如,如果单元格中的值低于另一个单元格中的值且用户不遵守此规则,我想自动设置焦点并开始编辑第一个单元格。

最优雅的方法是什么?我注意到ValidationResult.ErrorContent属性通常用于显示错误消息,但由于它是“object”类型,也许我可以自定义它以返回有关在验证错误情况下应获得焦点的单元格的信息?我不知道如何在XAML中恢复和使用该信息。

1 个答案:

答案 0 :(得分:0)

由于ValidationRule未从DependencyObject继承,因此您无法在自定义ValidationRule类中定义DependencyProperty并将其绑定到正确的UI元素。

然而,我可以想出一个可以帮助您解决问题的解决方案:

您仍然可以在自定义ValidationRule类中定义字符串属性(例如TargetUINameString),并将其设置为每个UI元素的名称,如下所示:

<TextBox Name="textbox1"...
     <c:MyValidationRule TargetUINameString="textbox1"/>
...

向窗口添加一个静态属性(比如说ActiveInstanceOfThis),这样就可以访问窗口类的活动实例。 (在窗口的构造函数中将其设置为this

然后使用FindName解析它:

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    if (value==null)
    {
        var uielement = 
            Window1.ActiveInstanceOfThis.stackPanel1.FindName(TargetUINameString)
            as TextBox;
        if(uielement!=null) uielement.Focus();
    }
}

它有点脏,但它有效!