2014-09-16 2 views
3

У меня есть свойство, которое выглядит примерно так:Как я могу найти все обработчики для вызова «RaisePropertyChanged»?

private ISomething currentSomething; 
    public ISomething CurrentSomething 
    { 
     get { return currentSomething; } 
     set 
     { 
      if (!object.Equals(currentSomething, value)) 
      { 
       currentSomething = value; 
       RaisePropertyChanged(() => CurrentSomething); 
      } 
     } 
    } 

Когда сеттер вызывается, значение правильно перетекает в currentSomething поле. Однако после строки RaisePropertyChanged(() => CurrentSomething); в одном из списков в поле currentSomething есть два из удаленных элементов.

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

Есть ли способ найти всех подписчиков на мероприятие RaisePropertyChanged?

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

+0

Предполагая, что нет явных * слушателей, я бы сделал глобальный поиск для «CurrentSomething» и посмотрел, что связано с ним. – BradleyDotNET

+0

@BradleyDotNET - Я пробовал это. Не повезло. – Vaccano

+1

Я не думаю, что есть способ просто «найти» всех слушателей (так как большинство будет в рамках), но я рад, что вы больше не застреваете! – BradleyDotNET

ответ

4

Вы можете использовать метод GetInvocationList() для события. Если у вас есть событие PropertyChanged на MyObject (типа MyClass), например, то вы можете получить абонентов, как это:

 var methodInfo = typeof (MyClass.PropertyChangedDelegate).GetMethod("GetInvocationList"); 
     var p = myObject.GetType().GetField("PropertyChanged", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(myObject); 
     var subscriberDelegates = (Delegate[])methodInfo.Invoke(p, null); 
     object[] subscriberObjects = subscriberDelegates.Select(sub => sub.Target).ToArray(); 

Это будет работать даже за пределами класса, который определяет событие.

+0

Выполняется ли это из-за пределов класса, определяющего событие? – Tengiz

+0

Это сейчас :) Я обновил код. – Bedford