「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と空になります。最終的な結果として、行は編集モードのままになりますが、セルに無効な値が赤い境界線で表示されます。今何が起こっているのか分かりますか?