INotifyPropertyChanging и validations: когда я поднимаю PropertyChanging?

INotifyPropertyChanged достаточно ясен, и я думаю, что я могу понять, когда его поднимать (т.е. когда я закончил обновление значений).
Если я реализую INotifyPropertyChanging, я собираюсь поднять это событие, как только я войду в setter или другой метод, который изменит состояние объектов, а затем продолжит любые действия и проверки, которые могут возникнуть.

Итак, я рассматриваю событие как уведомление о том, что свойство может измениться, но оно еще не изменено и может не завершиться успешно.

Если пользователи объекта используют это свойство (например, скажем, LINQ to SQL с использованием события для отслеживания изменений), я должен удерживать и только поднимать событие, как только я подтвердил, что значения, которые мне были предоставлены, хорошо, и состояние объекта действительно для изменения?

Каков контракт на это событие и какие побочные эффекты будут у абонентов?

Ответ 1

Если вашему объекту присваивается значение, которое является недопустимым для свойства, и вы генерируете исключение, вы не должны поднимать событие PropertyChanging. Вы должны только поднять событие, когда вы решите, что значение изменится. Типичный сценарий использования - это изменение простого поля:

public T Foo
 { get
    { return m_Foo;
    }
   set
    { if (m_Foo == value) return; //no need for change (or notification)
      OnPropertyChanging("Foo");
      m_Foo = value;
      OnPropertyChanged("Foo");
    }
 }

Ответ 2

В стороне - PostSharp имеет интересную возможность автоматического внедрения INotifyPropertyChanged - так > .

Ответ 3

Если вы вообще не хотите внедрять INotifyPropertyChanged, рассмотрите вместо этого Update Controls.NET. Это устраняет практически весь бухгалтерский код.