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

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

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

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

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


person Hamish Smith    schedule 04.10.2008    source источник


Ответы (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");
    }
 }
person Mark Cidade    schedule 04.10.2008
comment
видя, как вы работали над DLINQ (тогда это называлось бы правильно?), я думаю, это довольно авторитетно. Есть ли какая-нибудь ссылка, на которую вы можете мне указать? - person Hamish Smith; 04.10.2008
comment
DLINQ был разработан отделом разработчиков (в который входит команда Visual Studio). Команда ADO.NET создала LINQ to DataSet и LINQ to Entities. Ссылка на msdn.microsoft.com/en-us/library/ - person Mark Cidade; 04.10.2008

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

person Marc Gravell    schedule 04.10.2008
comment
Это интересно. Я использовал фрагмент кода (и есть базовый класс, который на самом деле содержит событие и вызывает его), но, похоже, он кричит о чьей-то чужой проблеме. - person Hamish Smith; 04.10.2008
comment
Кроме того, это также может быть «автоматически реализовано» с некоторой довольно интересной магией DI/IOC - увидено здесь (я не в восторге от этого, но это, по крайней мере, интересное педагогическое чтение) - person fostandy; 15.02.2011

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

person Michael L Perry    schedule 30.12.2008