2010-07-28 3 views
0

Я пытаюсь получить правило проверки, чтобы вернуть ошибку. Я реализовал 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 
} 

ответ

1

Объект IDataErrorInfo, который получает правило, будет экземпляром объекта ProjectExpenseItemsBO. Единственное свойство, которое вы проверяете, это Ошибка, которую вы внедрили для возврата this[string.Empty], который всегда будет возвращать string.Empty. Вероятно, вы либо хотите изменить свою реализацию свойства Error, чтобы посмотреть на все ошибки в объекте, или чтобы RowDataInfoValidationRule перебирал свойства и получал сообщение об ошибке для каждого из них с помощью индексатора.

Вы получаете ошибки проверки от модели, потому что ваша привязка к ItemNumber имеет значение ValidatesOnDataErrors, установленное на True, поэтому структура вызовет указатель с именем свойства ItemNumber и получит ваше сообщение об ошибке.

+0

, что делает общий смысл, и я чувствую себя немного глупо, потому что не вижу этого (новичок). Я добавил код, необходимый для передачи ошибки, и он работает! Что касается вашего второго ответа, хотя мой VR может получить доступ к ошибке, dg все еще ищет IDEI в модели для сообщения и результата проверки? Как я могу заставить правило переопределить IDEI в этом случае? Я пытаюсь заставить VR очистить ошибку проверки в dg, когда ошибка исправлена, но я могу сделать это только в том случае, если я сортирую или обновляю dg. Я думал, что VR установил результат в ValidResult, чтобы очистить ошибку. Кстати, спасибо! – steveareeno

+0

Позвольте мне что-то исправить. Я не обязательно хочу переопределять ошибку из IDEI в модели, которая действительно была для целей тестирования. Я хочу, чтобы очистить ошибку проверки в сетке, когда пользователь исправляет ошибку, чего не происходит, если я не сортирую или обновить dg. – steveareeno

+0

Хорошо, я понял. потому что столбец в моем dg имеет ValidatesOnDataErrors, установленный в true, он будет игнорировать результат VR. Я удалил его из колонки, и теперь все работает нормально. Я думал, что могу использовать их в сочетании друг с другом, но кажется, что это либо/или вещь. Все дело в том, чтобы очистить ошибку от dg, когда она была исправлена. В этом случае, похоже, VR могут это сделать, а IDEI не может, по крайней мере, не обновлять dg. – steveareeno

 Смежные вопросы

  • Нет связанных вопросов^_^