События в ViewModel с System.Windows.Interactivity.EventTrigger, это слабая ссылка? - PullRequest
5 голосов
/ 20 февраля 2012

В моем ViewModel есть событие.

public class MyViewModel:ViewModelBase
{
     ...
     public event EventHandler SomethingChanged;

     private void FireEvent()
     {
          if (SomethingChanged != null)
              SomethingChanged(this, EventArgs.Empty);
     }
     ...
}

в моем View, я использовал EventTrigger для прослушивания события, чтобы вызвать действие.

 <i:Interaction.Triggers>            
        <i:EventTrigger EventName="SomethingChanged" SourceObject="{Binding}">
            <i:SomeAction/>
        </i:EventTrigger>
 </i:Interaction.Triggers>

Это работает отличнохорошо.Однако мне любопытно, есть ли вероятность утечки памяти?Поскольку мой вид создается по требованию, это означает, что элемент управления добавляется и удаляется из дерева визуалов на основе пользователя.Исходный объект (ViewModel) имеет более длительное время жизни, чем слушатель (View).Поэтому, используя приведенный выше код, будет ли событие по-прежнему иметь сильную ссылку на удаленный прослушиватель (просмотр)?

1 Ответ

2 голосов
/ 30 июля 2013

В OnDetaching EventTriggerBase, он вызывает следующий код:

 this.OnSourceChanged(this.Source, null);

Это означает, что источник устанавливается с источника на нуль, а событие отменяется. Нет утечек памяти при правильной загрузке представления, что означает, что вызывается метод Detach.

...