Как я могу остановить запуск IDataErrorInfo для новых предметов? - PullRequest
1 голос
/ 29 августа 2011

Я занимаюсь разработкой приложения WPF (используя MVVM) и внедрил IDataErrorInfo в моей модели представления.Часть моей проверки проверяет, что обязательные поля были введены.Это отлично работает для редактирования существующих записей, но не обеспечивает приятного взаимодействия с пользователем при добавлении новых записей.Как только я загружаю новое представление, обязательные поля выделяются как недействительные.

Есть ли (желательно не хакерское) решение для этого?Кажется, это довольно стандартная вещь, которую хочется хотеть, поэтому я надеюсь, что мне не хватает чего-то простого.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2013

Вместо использования «ValidatesOnDataErrors = True» вы можете добавить DataErrorValidationRule вручную с атрибутом ValidatesOnTargetUpdated:

<TextBox>
   <TextBox.Text>
     <Binding Path="..." ValidatesOnExceptions="true">
        <Binding.ValidationRules>
            <DataErrorValidationRule ValidatesOnTargetUpdated="false"/>
        </Binding.ValidationRules>
     </Binding>
   </TextBox.Text>
</TextBox>
3 голосов
/ 29 августа 2011

Используйте флаг, который указывает, является ли запись новой. Проверьте этот флаг в вашей реализации IDataErrorInfo и установите флаг в значение true при первой попытке пользователя подтвердить ввод.

1 голос
/ 29 августа 2011

У меня обычно есть подпрограмма в моей сущности или в классе данных, которая удаляет все записи из моего словаря ошибок после инициализации.Я вызываю его после создания экземпляра.

Вы можете пойти еще дальше и получить инициализированное поле (логическое значение), которое будет установлено в False для новых объектов, True для существующих объектов.

Вы не делаетехочу, чтобы пользователь представил несколько шаблонов ошибок / проверок только потому, что они сгенерировали новый объект и еще не заполнили его данными.

Пример ViewModel

В этом примере у меня естьНедвижимость из моей ViewModel.Когда объект отгрузки загружается, свойство вызывает метод Clear в словаре ошибок.Если Отгрузка является постоянной записью из базы данных, она должна иметь действительные данные, поскольку их необходимо было проверить, чтобы сохранить в БД.если он новый, записи удаляются, и пользователю предоставляется свежая форма, готовая для ввода.

Public Property ShipmentRecord() As Shipment
    Get
        Return _shpShipmentRecord
    End Get
    Set(ByVal value As Shipment)
        _shpShipmentRecord = value
        ShipmentRecord.m_dirtyFields.Clear()
        OnPropertyChanged("ShipmentRecord")
    End Set
End Property

К сожалению, это был первый пример, который я смог найти, и он напрямую обращается к словарю m_dirtyFields (изначально был закрытым, но я установил его как Друг.) В большинстве случаев я бы создал метод доступа к словарю.

...