3

「Customer」クラスの ObservableCollection にバインドし、IDataErrorInfo を実装する DataGrid があります。Customer クラスのプロパティの 1 つは でintあり、私の IDataErrorInfo 実装では、有効な範囲内にあることを確認します。

public class Customer : IDataErrorInfo
{
    public int PercentDiscount { get; set; }

    ... other properties & methods removed for clarity

    public string this[columnName]
    {
        get
        {
            if (PercentDiscount < 0 || PercentDiscount > 10)
                return "Percent Discount is invalid";
        }
    }
}

私の XAML コード ビハインドでは、いくつかのイベントを処理します。編集中の行への参照を保存するPreparingCellForEdit場合:-

private void DataGrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
    _rowBeingEdited = e.Row;
}

次に、RowEditEndingイベントで、行が無効な状態にある場合に何らかのアクションを実行します (私の場合、Customer プロパティを以前の「適切な」値に戻します):-

private void DataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    if (_rowBeingEdited != null)
    {
        var errors = Validation.GetErrors(_rowBeingEdited);
        if (errors.Count > 0)
        {
            .. do something
        }
    }
}

これは、ユーザーが検証ルールに違反する数値を入力した場合は正常に機能しますが、ユーザーが数値以外の値を入力した場合、RowEditEndingイベントは発生せず、セルは編集状態のままになります。これは、WPF が数値以外の値をintプロパティにバインドできなかったためだと思います。これが発生したときに検出/処理できる方法はありますか?

最後の手段はPercentDiscountプロパティを文字列に変更することですが、私はこの方法を避けようとしています。

編集CellEditEnding- の代わりにイベントを使用して、両方のタイプのエラーを正常に処理できることがわかりましたRowEditEnding。ただし、新しい問題が発生しました。セルに無効な値を入力してからEnterを押すと、基になるプロパティが更新されないため、CellEditEnding が発生するValidation.GetErrorsと空になります。最終的な結果として、行は編集モードのままになりますが、セルに無効な値が赤い境界線で表示されます。今何が起こっているのか分かりますか?

4

2 に答える 2

1

特にあなたがすでに言及したので、これはあまり答えではないかもしれませんが、私はしばらくの間 DataGrid 検証と戦い、バッキング値を文字列にすることに頼ることになりました。int にバインドされた DataGridColumn にアルファ文字を入力すると、バインドまたは変換の例外が発生することがデバッガーの出力ウィンドウに表示されます。

UpdateSourceTrigger を変更するか、バインディングとプロパティの間にコンバーターを配置することで異なる動作を得ることができますが、文字列で値をバックアップするまで、必要なものを正確に取得することはできませんでした。

DataGridTextColumn から派生した独自の DataGridNumericColumn を作成することもできると思います。おそらく、バインディング/検証動作をより詳細に制御できるでしょう。

于 2013-04-12T23:51:14.510 に答える