WPF の DataGrid に問題があります。編集中に現在のセルのテキストを取得したい。問題は、最初にセルをコミットしないと値を取得できないことです。コミットする前にまずテキストを検証したい。
ありがとう。
WPF の DataGrid に問題があります。編集中に現在のセルのテキストを取得したい。問題は、最初にセルをコミットしないと値を取得できないことです。コミットする前にまずテキストを検証したい。
ありがとう。
さまざまな方法があります。
最もクリーンな方法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);
}
これが十分に明確であることを願っています:)