Я пытаюсь получить правило проверки, чтобы вернуть ошибку. Я реализовал IDataErrorInfo в моей модели, которая содержит мои свойства бизнес-объекта и сообщения, возвращаемые в результате проверки достоверности событий. Я также создал правило проверки. Проблема в том, что правило валидации запускается (добавлено в закладки), но ссылка IDataErrorInfo в правиле никогда не имеет ошибки, хотя реализация IDataErrorInfo моей модели создает ее. Дантарт определенно показывает, что произошел сбой проверки.проблемы с правилом проверки
Я проверил его, получив правило и модель возврата двух разных сообщений, и версия модели всегда возвращается. Это похоже на то, что мое правило не может видеть, что находится в объекте IDataErrorInfo, или просто создает новый экземпляр.
DataGrid:
<DataGrid ItemsSource="{Binding Path=ProjectExpenseItemsCollection}" AutoGenerateColumns="False"
Name="dgProjectExpenseItems" RowStyle="{StaticResource RowStyle}"
SelectedItem="{Binding Path=SelectedProjectExpenseItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
CanUserDeleteRows="True" CanUserAddRows="True">
<DataGrid.RowValidationRules>
<vr:RowDataInfoValidationRule ValidationStep="UpdatedValue" />
</DataGrid.RowValidationRules>
<DataGrid.Columns>
<DataGridTextColumn Header="Item Number"
Binding="{Binding ItemNumber, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
</DataGrid.Columns>
</DataGrid>
Validation Rule:
Объект "Idei" не равно нулю, но idei.Error всегда строка нулевой длины ("")
public class RowDataInfoValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
BindingGroup bindingGroup = (BindingGroup)value;
IDataErrorInfo idei = bindingGroup.Items[0] as IDataErrorInfo;
string error = (idei != null) ? idei.Error : null;
return (string.IsNullOrEmpty(error)) ? ValidationResult.ValidResult : new ValidationResult(false, error + ": ValidationRule");
}
}
Модель/Бизнес-объект:
public class ProjectExpenseItemsBO : IDataErrorInfo, IEditableObject, INotifyPropertyChanged
{
public string ItemNumber { get; set; }
public ProjectExpenseItemsBO() {}
// string method
static bool IsStringMissing(string value)
{
return String.IsNullOrEmpty(value) || value.Trim() == String.Empty;
}
#region IDataErrorInfo Members
public string Error
{
get { return this[string.Empty]; }
}
public string this[string propertyName]
{
get
{
string result = string.Empty;
if (propertyName == "ItemNumber")
{
if (IsStringMissing(this.ItemNumber))
{
result = "Item number cannot be empty-IDataError!";
}
}
return result;
}
}
#endregion
}
, что делает общий смысл, и я чувствую себя немного глупо, потому что не вижу этого (новичок). Я добавил код, необходимый для передачи ошибки, и он работает! Что касается вашего второго ответа, хотя мой VR может получить доступ к ошибке, dg все еще ищет IDEI в модели для сообщения и результата проверки? Как я могу заставить правило переопределить IDEI в этом случае? Я пытаюсь заставить VR очистить ошибку проверки в dg, когда ошибка исправлена, но я могу сделать это только в том случае, если я сортирую или обновляю dg. Я думал, что VR установил результат в ValidResult, чтобы очистить ошибку. Кстати, спасибо! – steveareeno
Позвольте мне что-то исправить. Я не обязательно хочу переопределять ошибку из IDEI в модели, которая действительно была для целей тестирования. Я хочу, чтобы очистить ошибку проверки в сетке, когда пользователь исправляет ошибку, чего не происходит, если я не сортирую или обновить dg. – steveareeno
Хорошо, я понял. потому что столбец в моем dg имеет ValidatesOnDataErrors, установленный в true, он будет игнорировать результат VR. Я удалил его из колонки, и теперь все работает нормально. Я думал, что могу использовать их в сочетании друг с другом, но кажется, что это либо/или вещь. Все дело в том, чтобы очистить ошибку от dg, когда она была исправлена. В этом случае, похоже, VR могут это сделать, а IDEI не может, по крайней мере, не обновлять dg. – steveareeno