我有一个 DataGrid,我将它绑定到“客户”类的 ObservableCollection,实现 IDataErrorInfo。Customer 类的属性之一是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为空。最终结果是该行离开编辑模式,但仍然在带有红色边框的单元格中显示无效值。知道现在发生了什么吗?