【问题标题】:WPF DataGrid: set focus on a specific cell after a row validation errorWPF DataGrid:在行验证错误后将焦点设置在特定单元格上
【发布时间】:2011-10-12 13:25:42
【问题描述】:
我有一个带有 RowValidationRules 的 WPF DataGrid。如果验证失败,我想设置焦点或开始编辑特定单元格。
例如,如果一个单元格中的值低于另一个单元格中的值并且用户不遵守此规则,我想自动设置焦点并开始编辑第一个单元格。
最优雅的方法是什么?我注意到 ValidationResult.ErrorContent 属性通常用于显示错误消息,但由于它是“对象”类型,也许我可以自定义它以返回有关在发生验证错误时应该获得焦点的单元格的信息?不过,我不确定如何在 XAML 中恢复和使用该信息。
【问题讨论】:
标签:
wpf
validation
datagrid
focus
【解决方案1】:
由于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();
}
}
它有点脏,但它有效!