как работает PropertyChangedEventHandler?
это действительно простой вопрос, но мне было интересно, может ли кто-нибудь объяснить, что на самом деле делает 4-я строка? таким образом, первая строка дает событие обработчику. Я действительно не знаю, в каких обстоятельствах обработчик вернет null или что делает последняя строка.
когда вы передаете обработчику свой объект и какое свойство изменилось, что он делает с ними?
PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
Я предполагаю, что я использовал это, чтобы получить это код но я хотел бы понять, что это делает полностью.
3 ответов
если вы только что сделали:
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));
}
PropertyChanged
- это событие, которое было объявлено так, согласно его определению в интерфейсе:
public event PropertyChangedEventHandler PropertyChanged;
событий которые определены таким образом, на самом деле являются синтаксическим сахаром для списка обработчиков событий, к которым вы можете добавить делегат (то есть ссылку на функцию), подписавшись или удалить делегат, отписавшись.
теперь, когда вы вызываете событие, т. е. PropertyChanged(...)
, то что происходит внутри, так это то, что каждый делегат в этом внутреннем списке вызывается отдельно с параметрами. Это сообщит всем подписчикам вашего мероприятия, что событие произошло.
теперь, причина всего этого с handler
переменной, что PropertyChanged
может быть null. Если на него ничего не подписано, вызов события (или, скорее, списка обработчиков событий) не будет работать, поэтому это просто способ убедиться, что вы действительно можете выполнить обработчик.
handler
может быть null, если нет обработчиков подписка до событие, четвертая строка вызывает событие для данного имени свойства (которое выполняет все подписанные обработчики).
обычно платформа WPF подписывается на PropertyChanged
когда вы используете привязки, поэтому он может обновить привязку после изменения связанного свойства.