У меня есть DataGrid, который я привязываю к ObservableCollection классов «Customer», реализуя IDataErrorInfo. Одним из свойств на классе Customer является int
, и в моей реализации IDataErrorInfo проверить, что оно находится в пределах допустимого диапазона, e.g.:-Несоответствие валидации WPat datagrid
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
случае, я какое-либо действие, если строка находится в нерабочем состоянии (в моем случае я вернуть свойства клиентов обратно к предыдущим «хорошим» значениям): -
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
. Появилась новая проблема: если я ввешу недопустимое значение в ячейку, а затем нажмите Введите, базовое свойство не будет обновляться, поэтому при вызове CellEditEnding Validation.GetErrors
пуст. Конечным результатом является то, что строка выходит из режима редактирования, но все же показывает недопустимое значение в ячейке с красной рамкой. Любая идея, что происходит сейчас?