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. Это устраняет практически весь бухгалтерский код.