WPF DataGrid在没有提交的情况下获取脏的单元数据

时间:2012-05-15 11:52:05

标签: wpf

我的DataGrid for WPF有问题。我想在编辑时获取当前单元格的文本。问题是如果不首先提交单元格,就无法获得值。我想在提交之前先验证文本。

感谢。

1 个答案:

答案 0 :(得分:0)

你有不同的方法。

最干净的方法是在模型中实现IDataErrorInfo并在绑定中设置ValidatesOnDataError=true。 (如果您不了解IDataErrorInfo,我真的鼓励您花一些时间来精益求精,因为它是一个非常有用的工具并且非常易于使用)

另一种替代解决方案,需要更少的代码,但可能不那么干净:

您只需将事件处理程序添加到CellEditEnding(或覆盖DataGrid.OnCellEditEnding)并验证在提交之前输入的数据。如果验证失败,您只需取消CellEditEnding事件。

如果您覆盖OnCellEditEnding(这与添加事件处理程序几乎完全相同),这是代码。

我为你举了一个简单的例子,我在这里尝试解析输入的文本。 您可以使用EditingElement

DataGridCellEditEndingEventArgs属性访问用户输入的文字

以下是代码:

protected override void OnCellEditEnding(DataGridCellEditEndingEventArgs e)
        {
            try
            {
                // Try to parse the text
                double test = Double.Parse((e.EditingElement as TextBox).Text);
            }
            catch (FormatException)
            {
                // Mark the current editing element as invalid and cancel the event
                TextBox text = e.EditingElement as TextBox;
                BindingExpression bindingExpression =
                    BindingOperations.GetBindingExpression(text, TextBox.TextProperty);
                BindingExpressionBase bindingExpressionBase =
                    BindingOperations.GetBindingExpressionBase(text, TextBox.TextProperty);
                ValidationError validationError =
                    new ValidationError(new ExceptionValidationRule(), bindingExpression);
                Validation.MarkInvalid(bindingExpressionBase, validationError);
                e.Cancel = true;
            }
            base.OnCellEditEnding(e);
        }

希望这很清楚:)