我有一个 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
为空。最终结果是该行离开编辑模式,但仍然在带有红色边框的单元格中显示无效值。知道现在发生了什么吗?