Automatisches Aufrufen von OnDetaching () für Silverlight-Verhalten

Ich verwende mehrere Mischungsverhalten und -auslöser für ein Silverlight-Steuerelement. Ich frage mich, ob es einen Mechanismus zum automatischen Trennen oder Sicherstellen gibt, dass OnDetaching () für ein Verhalten oder einen Trigger aufgerufen wird, wenn das Steuerelement nicht mehr verwendet wird (d. H. Aus der visuellen Struktur entfernt wird).

Mein Problem ist, dass aufgrund eines der Verhalten ein verwaltetes Speicherverlust mit dem Steuerelement vorliegt. Das Verhalten abonniert ein Ereignis für ein langlebiges Objekt in der Überschreibung OnAttached () und sollte das Abonnement für dieses Ereignis in der Überschreibung OnDetaching () aufheben, damit es ein Kandidat für die Garbage Collection wird. OnDetaching () scheint jedoch nie aufgerufen zu werden, wenn ich das Steuerelement aus dem visuellen Baum entferne. Die einzige Möglichkeit, dies zu erreichen, besteht darin, das problematische Verhalten explizit zu entfernen, BEVOR das Steuerelement entfernt wird und dann der ordnungsgemäße Müll eingesammelt wird .

Im Moment bestand meine einzige Lösung darin, eine öffentliche Methode im Code-Behind für das Steuerelement zu erstellen, mit der bekannte Verhaltensweisen, die zu Problemen bei der Garbage Collection führen könnten, behoben werden können. Es liegt am Client-Code, dies aufzurufen, bevor das Steuerelement aus dem Panel entfernt wird. Ich mag diesen Ansatz nicht wirklich, deshalb suche ich nach einer automatischen Methode, die ich übersehen habe, oder nach einem besseren Vorschlag.

public void DetachBehaviors()
{
     foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
     {
          behavior.Detach();
     }

     //continue detaching all known problematic behaviors on the control....
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage