0

WPF の DataGrid に問題があります。編集中に現在のセルのテキストを取得したい。問題は、最初にセルをコミットしないと値を取得できないことです。コミットする前にまずテキストを検証したい。

ありがとう。

4

1 に答える 1

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);
        }

これが十分に明確であることを願っています:)

于 2012-05-15T13:12:32.847 に答える