Chamando automaticamente OnDetaching () para comportamentos do Silverlight
Estou usando vários comportamentos e gatilhos do Blend em um controle do silverlight. Gostaria de saber se existe algum mecanismo para desanexar automaticamente ou garantir que OnDetaching () seja chamado para um comportamento ou gatilho quando o controle não estiver mais sendo usado (ou seja, removido da árvore visual).
Meu problema é que há um vazamento de memória gerenciada com o controle por causa de um dos comportamentos. O comportamento se inscreve em um evento em algum objeto de longa duração na substituição OnAttached () e deve cancelar sua inscrição nesse evento na substituição OnDetaching () para que ele possa se tornar um candidato à coleta de lixo. No entanto, OnDetaching () nunca parece ser chamado quando removo o controle da árvore visual ... a única maneira de fazê-lo acontecer é desanexar explicitamente os comportamentos problemáticos ANTES de remover o controle e, em seguida, coletar o lixo corretamente. .
No momento, minha única solução era criar um método público no code-behind para o controle que pode passar e desanexar quaisquer comportamentos conhecidos que causariam problemas de coleta de lixo. Caberia ao código do cliente saber chamar isso antes de remover o controle do painel. Eu realmente não gosto dessa abordagem, então estou procurando uma maneira automática de fazer isso que estou ignorando ou uma sugestão melhor.
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}