我对 WPF 的 DataGrid 有疑问。我想在编辑时获取当前单元格的文本。问题是如果不先提交单元格,您将无法获得值。我想在提交之前先验证文本。
谢谢。
你有不同的方法来做到这一点。
最干净的方法是IDataErrorInfo
在您的模型中实现并ValidatesOnDataError=true
在您的绑定中设置。(如果你不知道IDataErrorInfo
,我真的鼓励你花一些时间来学习它,因为它是一个非常有用的工具并且非常易于使用)
另一种替代解决方案,它需要更少的代码,但可能不太干净:
您可以将事件处理程序添加到CellEditEnding
(或覆盖DataGrid.OnCellEditEnding
)并在提交之前验证输入的数据。如果验证失败,您只需取消 CellEditEnding 事件。
如果您覆盖,这是代码OnCellEditEnding
(这几乎与添加事件处理程序完全相同)
我为你举了一个简单的例子,在这里我只是尝试解析输入的文本。您可以访问具有EditingElement
a 属性的用户输入的文本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);
}
希望这足够清楚:)