Как работает PropertyChangedEventHandler? - программирование
Подтвердить что ты не робот

Как работает PropertyChangedEventHandler?

Это очень простой вопрос, но мне было интересно, может ли кто-нибудь объяснить, что делает четвертая строка? поэтому первая строка передает событие обработчику. Я не знаю, в каких обстоятельствах обработчик вернет null или что делает последняя строка.

Когда вы передаете обработчику свой объект и какое свойство изменилось, что он делает с ними?

PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event

if (handler != null)
{
    handler(this, new PropertyChangedEventArgs(name));
}

Я предполагаю, что использовал это, чтобы получить этот код, но я хотел бы понять, что он делает полностью.

4b9b3361

Ответ 1

Если вы только что сделали:

PropertyChanged(this, new PropertyChangedEventArgs(name))

вы получите NullReferenceException, если никто не был подписан на событие PropertyChanged. Чтобы противодействовать этому, вы добавляете нулевую проверку:

if(PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(name))
}

Теперь, если вы используете многопоточность, кто-то может отказаться от подписки между нулевой проверкой и вызовом события, поэтому вы все равно можете получить NullReferenceException. Чтобы обработать это, мы копируем обработчик события во временную переменную

  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }

Теперь, если кто-то отменит подписку на событие, наша временная переменная handler будет по-прежнему указывать на старую функцию, и этот код теперь не может выбрасывать NullReferenceException.

Чаще всего вы увидите, что люди используют ключевое слово var, вместо этого это делает так, что вам не нужно вводить полный тип временной переменной, это форма, которую вы чаще всего увидите в коде.

  var handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }

Ответ 2

PropertyChanged - это событие, которое было объявлено следующим образом: согласно его определению в интерфейсе:

public event PropertyChangedEventHandler PropertyChanged;

События, которые определены как на самом деле, являются синтаксическим сахаром для списка обработчиков событий, которые вы можете добавить делегата (это ссылка на функция) путем подписки или удаления делегата, отменяя подписку.

Теперь, когда вы вызываете событие, т.е. PropertyChanged(...), то внутренне происходит то, что каждый делегат в этом внутреннем списке называется отдельно с параметрами. Это сообщит всем подписчикам вашего мероприятия, что произошло событие.

Теперь причина всего этого с переменной handler заключается в том, что PropertyChanged может быть нулевым. Если ничего не подписано на него, то вызов события (или, скорее, списка обработчиков событий) не будет работать, поэтому это всего лишь способ убедиться, что вы действительно можете выполнить обработчик.

Ответ 3

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

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