INotifyPropertyChanging и проверки: когда я поднимаю PropertyChanging?

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

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

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

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

3 ответов


Если вашему объекту задано значение, недопустимое для свойства, и вы создаете исключение, вы не должны поднимать 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");
    }
 }

в сторону -PostSharp имеет интересную возможность автоматической реализации INotifyPropertyChanged -вот так.


Если вы хотите избежать реализации INotifyPropertyChanged вообще, рассмотрите возможность использования Контроль Обновления .Сети вместо. Это устраняет почти весь бухгалтерский код.