Как не потерять получателя при отправке уведомления? - PullRequest
0 голосов
/ 13 октября 2011

Как работают мои программы

У меня есть бэкэнд с несколькими объектами, у которых есть событие PropetyChanged.Когда какое-либо свойство изменяется, уведомление запускается.На внешней стороне у меня есть GUI, написанный на WPF, и несколько свойств привязаны непосредственно к виджетам WPF.

Чтобы адаптировать GUI, все вычисления выполняются в дополнительном потоке.

Итак, вобщее, классическое приложение WPF.

Ошибка

public void OnPropertyChanged(string name)
{
  if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(name)); // (*)
}

Этот код отправляет уведомления, однако он генерирует исключение в (*), поскольку PropertyChanged имеет значение null (да, просто после проверка на ноль).

Вопрос

Я думаю, это из-за повторной привязки в WPF - в моем коде я меняю отправителя, поэтому WPF должен отменить регистрацию получателя и зарегистрировать его в новомотправитель.Исключение выдается редко (я получаю одно исключение каждые ~ 40000 проходов выполнений, каждое эквивалентно примерно одному изменению отправителя), но это происходит .

Сейчас - как правильно заблокировать PropertyChange, чтобы я мог проверять на нулевое значение И отправлять уведомление как атомарную операцию? Я не хочу делать это методом проб и ошибок, потому что я мог обнаруживать побочные эффекты при каждом 1-м выполнении.

Ответы [ 2 ]

5 голосов
/ 13 октября 2011

Существует шаблон для решения этой проблемы:

var evt = PropertyChanged;
if ( evt != null ) evt( this, new PropertyChangedEventArgs( name ) );
1 голос
/ 13 октября 2011

Вы можете перехватить проводку события в объявлении свойства события

private PropertyChangedEventHandler _propertyChanged;
public PropertyChangedEventHandler PropertyChanged
{
   add 
   { 
     // intercept here
     _propertyChanged += value; 
   }
   remove 
   { 
     // intercept here
     _propertyChanged -= value; 
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...