2015-08-26 2 views
1

Je veux éviter certaines fuites de mémoire de base sur la liaison à Static membres ou ... dans mon WPFWindow.WPF Dissocier tous les éléments et leurs sous-éléments de toutes les liaisons

Cette fenêtre contient plusieurs UserControl et element et contient des ressources static. Je sais que je devrais unbind les bindings à Static classes pour éviter des fuites de mémoire et je sais que ce genre de unbinding:

BindingOperations.ClearAllBindings(....); 

BindingOperations.ClearBinding(...., ....); 

Element.ItemsSource= null; 

Mais ma question est:

Connaissez-vous ou de recommander une automatiqueUnbind système (certaines classes et codes qui fonctionnent comme un mécanisme pour dissocier tous les éléments pour l'appeler si nécessaire) pour l'utiliser lorsque vous voulez fermer la fenêtre pour vous assurer qu'il n'y a pas de liaison à aucun élément dans le Window ou UserControls et elements et tout sub-elements ???

Je trouve un moyen sûr à utiliser en cas de fermeture de la fenêtre ...

Répondre

3

Je ne crois qu'il ya un moyen automatique pour ce faire, mais je définissais mes propres méthodes d'extension sur DependencyObject pour ce objectif.

public static IEnumerable<DependencyObject> EnumerateVisualChildren(this DependencyObject dependencyObject) 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++) 
    { 
     yield return VisualTreeHelper.GetChild(dependencyObject, i); 
    } 
} 

public static IEnumerable<DependencyObject> EnumerateVisualDescendents(this DependencyObject dependencyObject) 
{ 
    yield return dependencyObject; 

    foreach (DependencyObject child in dependencyObject.EnumerateVisualChildren()) 
    { 
     foreach (DependencyObject descendent in child.EnumerateVisualDescendents()) 
     { 
      yield return descendent; 
     } 
    } 
} 

public static void ClearBindings(this DependencyObject dependencyObject) 
{ 
    foreach (DependencyObject element in dependencyObject.EnumerateVisualDescendents()) 
    { 
     BindingOperations.ClearAllBindings(element); 
    } 
} 
+0

merci. Je voulais dire un mécanisme comme votre solution qui fait du «tout découpler» comme un travail automatique. mais que penses-tu de ton code? Dose cela fonctionne seulement au niveau 2 de 'DependencyObjects'? – RAM

+0

'EnumerateVisualDescendents' est une fonction récursive, voir là:' child.EnumerateVisualDescendents() 'dans le foreach interne – Domysee

+0

Ou oui, c'est une fonction récursive. Quel est votre avis sur la performance de ce code et sa vitesse? – RAM