我有一個DataGrid的WPF的一個問題。我想在編輯它時獲取當前單元格的文本。問題在於,如果不先提交單元格,就無法獲得該值。我想在提交之前先驗證文本。WPF的DataGrid變髒細胞的數據沒有提交
謝謝。
我有一個DataGrid的WPF的一個問題。我想在編輯它時獲取當前單元格的文本。問題在於,如果不先提交單元格,就無法獲得該值。我想在提交之前先驗證文本。WPF的DataGrid變髒細胞的數據沒有提交
謝謝。
你有不同的方式來做到這一點。
最簡潔的一個是在您的模型中實現IDataErrorInfo
並在您的綁定中設置ValidatesOnDataError=true
。 (如果你不知道IDataErrorInfo
,我真的建議您花一些時間來瘦,因爲它是一個非常有用的工具,是非常容易使用)
另一種替代方案,這需要更少的代碼,但可能不那麼幹淨:
您可以添加事件處理程序到CellEditEnding
(或覆蓋DataGrid.OnCellEditEnding
)並驗證提交之前輸入的數據。如果驗證失敗,您只需取消CellEditEnding事件。
下面的代碼,如果你忽略OnCellEditEnding
(這幾乎是完全一樣只是添加事件處理程序)
我採取了一個簡單的例子給你,在這裏我只是嘗試解析輸入的文本。 您可以訪問由用戶提供的DataGridCellEditEndingEventArgs
這裏EditingElement
屬性中輸入文本是代碼:
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);
}
希望這是很清楚:)
謝謝!替代解決方案奏效。但是,我還使用「OnCellEditEnding」在轉移到另一個單元格後立即提交每個單元格/當datagrid失去焦點時。如果我使用它,轉移到另一個單元格,它不會提交最後一個單元格。有沒有辦法解決這個問題? – enlilbinny
嗯..這似乎並不奇怪,我都:你基本上要你的DataGrid,以防止犯未經驗證的文本。所以如果你寫無效的文本和切換單元格,正常的行爲將是避免提交無效的文本,對吧? – Damascus
是的,這是正確的。我正在檢查每個按鍵。 – enlilbinny