Gibt es eine Möglichkeit zum Entfernen von Bindungen aus allen gebundenen Elementen eines Formulars schließen Ereignis?

8

Demnach Dokument , verursacht der folgende Code einen Speicherverlust in WPF:

%Vor%

Das Gleiche passiert, wenn wir einen Wert in XAML binden:

%Vor%

Um verbindliche Speicherlecks zu vermeiden, müssen wir die Bindung beim Schließen des Formulars wie folgt entfernen:

%Vor%

Frage :

Gibt es eine Möglichkeit, Bindungen von allen gebundenen Elementen in Formular- und untergeordneten Steuerelementen zu entfernen?

Es scheint, dass ich hier eine rekursive Methode brauche.

    
Andrew Orsich 20.01.2011, 15:33
quelle

2 Antworten

4

Beachten Sie, dass das angegebene Beispiel sehr isoliert und in einer Bindungssituation nicht typisch ist. Das referenzierte Dokument skizziert dies ...

  

Das TextBlock-Steuerelement hat eine Bindung an   ein Objekt (myGrid) mit a   Referenz zurück zum TextBlock (es ist   einer meiner myGrid-Kinder).

Das Problem liegt in der Tatsache, dass die Bindung über UIElement -Objekte stattfindet UND eines der Objekte ist ein Kind des Containers und die Property, an die gebunden wird, ist keine DependencyProperty . Dies ist wiederum nicht typisch, da die meisten Bindungen für ein Objekt / eine Eigenschaft auftreten, die INotifyPropertyChanged implementiert.

Wenn Sie in Ihrer Anwendung mehrere Bindings wie diese haben, sollten Sie sie nach Bedarf entfernen, wenn der angegebene Container wie im entsprechenden Dokument erwähnt geschlossen wird.

Ein anderer Ansatz besteht darin, einfach die Daten, die Sie für Ihr Objekt benötigen, durch die View- und Ignorierungsbindung für die UIElement -Eigenschaften verfügbar zu machen, die nicht vom Typ DependencyPrperty sind. Obwohl dies nicht immer praktisch ist, wird es Sie von dem oben genannten Problem lindern.

    
Aaron McIver 20.01.2011, 15:55
quelle
6

In WPF 4 müssen Sie sich keine Gedanken über Lecks machen, wenn Sie an ein Objekt binden, auch wenn es nicht INotifyPropertyChanged oder DependencyObject ist. Dieser Fehler wurde behoben.

Wie auch immer, ich denke, BindingOperations.ClearAllBindings wird hilfreich sein .

    
Marat Khasanov 20.01.2011 18:13
quelle

Tags und Links