Это на самом деле проблема с дизайном (или его документацией) PropertyChangedEventArgs
.Установка PropertyName
в ноль означает «все свойства этого объекта изменились».Но если класс закрыт или вы используете отражение, вы не можете знать, что все свойства объекта изменились.Самое большее, что вы можете сказать, это то, что все свойства в базовом классе объекта изменились.
Это достаточная причина, чтобы не использовать это конкретное соглашение в моей книге, за исключением очень небольшого числа случаев, когда я создаю запечатанные классы, которые реализуют уведомление об изменении свойства.
В качестве практическоговажно то, что вы действительно пытаетесь сделать, это просто вызвать одно событие, которое сообщает слушателям «целый набор свойств этого объекта изменился, но я не собираюсь рассказывать вам о них по одному».Когда вы говорите:
, я вижу случаи, когда PropertyChangedEventArgs отправляется с нулевым значением, чтобы указать, что все свойства объекта изменились.Это кажется неэффективным и может привести к тому, что будет инициировано гораздо больше событий, чем необходимо.
... фактическое намерение - полная противоположность.Если метод изменяет свойства Foo
, Bar
, Baz
и Bat
объекта, и у объекта есть только четыре или пять свойств, повышение одного события, вероятно, лучше, чем повышение четырех.С другой стороны, если объект имеет шестьдесят свойств, вероятно, лучше поднять четыре события, заставляя каждого из слушателей объекта - даже тех, кто не смотрит на эти четыре свойства - делать то, что они делают, когда изменяются свойства, которые им нужныпотому что эти свойства этого не сделали.
Проблема в том, что система уведомлений об изменении свойств, как она была разработана, не является достаточно детализированным инструментом для каждой отдельной работы.Он спроектирован так, чтобы быть полностью универсальным, и в нем нет знаний о конкретной области приложения, встроенной в него.
И это, как мне кажется, то, чего не хватает в вашем дизайне: знание области приложения.
Во втором примере, если объект Fixture
имеет, скажем, десять свойств, которые зависят от значения FixtureStatus
, повышение десяти событий изменения свойств может показаться немного чрезмерным.Может быть это.Возможно, объект должен вызвать событие FixtureStatusChanged
.Затем классы, обладающие знаниями в области вашего приложения, могут прослушивать это одно событие и игнорировать событие PropertyChanged
.(Вы по-прежнему вызываете событие PropertyChanged
для других свойств, так что объекты, которые не знают, что означает событие FixtureStatusChanged
, могут оставаться актуальными, то есть если вашему классу все еще необходимореализовать INotifyPropertyChanged
, как только вы реализовали FixtureStatusChanged
.)
Вторичный комментарий: Большинство классов в юниверсе C #, если они реализуют метод, вызывающий событие Foo
, вызывают этот метод OnFoo
,Это важное соглашение: оно делает связь между методом и событием явной и делает тот факт, что код, вызывающий метод, вызывает событие, которое легко распознать.Notify
это слабое название для метода в целом - уведомить кого?которого?- и в этом случае это фактически запутывает что-то, что должно быть сделано явным.Уведомление об изменении свойства достаточно сложно без соглашения об именах, скрывающего тот факт, что оно происходит.