Estoy usando varios comportamientos y activadores de mezcla en un control Silverlight. Me pregunto si hay algún mecanismo para separar automáticamente o asegurar que OnDetaching() se llame para un comportamiento o desencadenar cuando el control ya no se usa (es decir, eliminado del árbol visual).Llamada automática OnDetaching() para Comportamientos de Silverlight
Mi problema es que hay una pérdida de memoria administrada con el control debido a uno de los comportamientos. El comportamiento se suscribe a un evento en algún objeto de larga duración en la anulación OnAttached() y debe anular su suscripción de ese evento en la anulación OnDetaching() para que pueda convertirse en un candidato para la recolección de elementos no utilizados. Sin embargo, nunca parece que se llame a OnDetaching() cuando elimino el control del árbol visual ... la única manera en que puedo lograr que ocurra es separando explícitamente los comportamientos problemáticos ANTES de quitar el control y luego es correctamente recolectada. .
En este momento mi única solución era crear un método público en el código subyacente para el control que puede pasar y desconectar los comportamientos conocidos que podrían causar problemas de recolección de basura. Depende del código del cliente saber llamar esto antes de quitar el control del panel. Realmente no me gusta este enfoque, por lo que estoy buscando una manera automática de hacer esto que estoy pasando por alto o una mejor sugerencia.
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}
Gracias! Este enfoque funcionó bien para nuestras necesidades. – Jaans