2

我正在我的 DataGrid 中实现编辑功能。一个典型的CellEditingTemplate细胞看起来像这样:-

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Grid.Column="0" 
                 Text="{Binding Concentration, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=LostFocus}"
                 Validation.ErrorTemplate="{StaticResource errorTemplate}" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

在此示例中,有一个 TextBox 绑定到名为“Concentration”的属性,该属性是 double 类型的属性,通过验证以确保它在给定范围内。绑定到网格的模型是IDataErrorInfo顺便实现的。

问题是,尽管输入无效值时错误模板会突出显示单元格,但没有什么可以阻止我将焦点从该单元格(或行)移开。使用数据网格编辑处理验证的首选方法是什么?我想知道是否可以阻止用户在输入有效值之前离开单元格,但这可能很危险——在输入有效值之前,他们将无法做任何事情(甚至关闭应用程序)。

如果数据网格包含任何无效行,另一个选项可能是阻止用户继续。但是测试这个的最好方法是什么?IDataErrorInfo 没有提供我可以在每个行的模型上检查的“IsValid”属性。

最后,如果用户输入的内容无效,我可以将模型的属性恢复为之前的“好”值(或默认值)。

有什么建议么?顺便说一句,我正在使用 MVVM。

4

2 回答 2

2

我用它来查看 IDataerrorInfo 对象是否有任何错误,实现的一小段:

protected Dictionary<string, string> _propertyErrors = new Dictionary<string, string>();
public bool HasErrors {
    get { return (_propertyErrors.Count) > 0; }
}

然后我可以处理评估此属性后要做什么的逻辑。您是否要阻止导航、关闭应用程序等。然后您需要评估该代码中的错误,然后取消该操作。

于 2013-04-11T17:49:11.057 回答
0

我过去曾使用此方法来确定数据网格是否有错误:

private bool HasError(DataGrid dg,)
{
   bool errors = (from c in
                    (from object i in dg.ItemsSource
                     select dg.ItemContainerGenerator.ContainerFromItem(i))
                  where c != null
                  select Validation.GetHasError(c)
                 ).FirstOrDefault(x => x);
   return errors;
}

然后,如果方法返回 true,则只需阻止下一步操作。

于 2013-04-11T17:27:04.747 回答