Автоматический вызов OnDetaching () для поведения Silverlight
Я использую несколько вариантов поведения и триггеров Blend для элемента управления silverlight. Мне интересно, существует ли какой-либо механизм для автоматического отсоединения или обеспечения того, чтобы OnDetaching () вызывался для поведения или триггера, когда элемент управления больше не используется (т.е. удаляется из визуального дерева).
Моя проблема заключается в том, что с элементом управления произошла управляемая утечка памяти из-за одного из вариантов поведения. Поведение подписывается на событие некоторого долгоживущего объекта в переопределении OnAttached () и должно отписываться от этого события в переопределении OnDetaching (), чтобы оно могло стать кандидатом на сборку мусора. Однако OnDetaching (), кажется, никогда не вызывается, когда я удаляю элемент управления из визуального дерева ... единственный способ, которым я могу это сделать, - это явное отключение проблемного поведения ПЕРЕД удалением элемента управления, а затем он должным образом собирает мусор ,
Прямо сейчас мое единственное решение состояло в том, чтобы создать общедоступный метод в выделенном фрагменте кода для элемента управления, который может проходить и отключать любые известные способы поведения, которые могут вызвать проблемы со сборкой мусора. Клиентский код должен знать, как это вызвать, прежде чем удалять элемент управления с панели. Мне не очень нравится этот подход, поэтому я ищу какой-то автоматический способ сделать это, который я пропускаю, или лучшее предложение.
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}