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