Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Wenn Sie die Datenbindung in Windows Presentation Foundation verwenden, kann ein Speicherleck auftreten

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 938416
Problembeschreibung
Wenn Sie die Datenbindung in Microsoft Windows Presentation Foundation (WPF) verwenden, kann ein Speicherleck auftreten.
Ursache
Dieses Problem tritt auf, wenn die folgenden Bedingungen erfüllt sind:
  • Ein Data-Binding-Pfad bezieht sich auf die Eigenschaft P des Objekts X.
  • Objekt X enthält einen direkten Verweis oder einen indirekten Verweis auf das Ziel der Data-Binding-Vorgang.
  • Eigenschaft P erfolgt über eine PropertyDescriptor anstelle von Objekt ein "DependencyProperty" Objekt oder eine PropertyInfo -Objekt.
Abhilfe
Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen.

Methode 1

Access-Eigenschaft P durch einen DependencyProperty -Objekt.

Methode 2

INotifyPropertyChanged -Schnittstelle für Objekt verfügbar machen X.

Methode 3

Stellen Sie den Modus der Datenbindung an OneTime.
Status
Dieses Verhalten ist beabsichtigt.
Weitere Informationen
In WPF ist ein Data-Binding-Vorgang, der nicht als gekennzeichnet ist OneTime für Benachrichtigungen über Eigenschaftenänderungen aus dem Quellobjekt (Objekt muss überwacht werden. X). WPF verwendet die integrierten Benachrichtigungen der DependencyProperties -Klasse oder die Benachrichtigungen von der INotifyPropertyChanged -Schnittstelle.

Wenn die DependencyProperties -Klasse und die INotifyPropertyChanged -Schnittstelle verfügbar sind, verwendet WPF das ValueChanged -Ereignis. Dieses Verhalten umfasst das Aufrufen der PropertyDescriptor.AddValueChanged -Methode für das PropertyDescriptor -Objekt, das die Eigenschaft entspricht P. Leider führt diese Aktion die common Language Runtime (CLR) einen starken Verweis von diesem PropertyDescriptor Objekt zu Objekt erstellen X. Die CLR behält einen Verweis auf das Objekt PropertyDescriptor auch in eine globale Tabelle. Dieses Verhalten führt zu eine Kette Verweis in der folgenden Reihenfolge auftreten:
  1. Globale Tabelle
  2. Die PropertyDescriptor Objekt
  3. Objekt X
  4. Das Ziel der Datenbindung

    Hinweis Die Referenz zwischen Objekt X und dem Ziel die Datenbindung entsteht durch die erste Bedingung, die im Abschnitt "Ursache" aufgeführt ist.
  5. Bindung
Solange das Ziel die Datenbindung verwendet wird, muss die Bindung weiterhin auf Änderungen überwachen. Dieses Verhalten bleibt den Verweis zwischen den PropertyDescriptor -Objekt und Objekt X, und das Ziel bleibt, verwendet. Dieses Verhalten verursacht einen Speicherverlust in Objekt X und in jedes Objekt, welches Objekt X verweist. Zu diesen Objekten gehören das Ziel für die Datenbindung.

Hilfsverfahren 1 und Hilfsverfahren 2 dazu führen, dass WPF, eine bevorzugte Benachrichtigungsmechanismen zu verwenden. Methode 3 der Problemumgehung weist WPF nicht zu hören für Änderungsbenachrichtigungen. Alle drei Workarounds zu vermeiden, erstellen die Referenz zwischen den PropertyDescriptor -Objekt und Objekt X.

Im folgenden Codebeispiel werden die Bedingungen für den Speicherverlust erstellt.
<Label Name="MyLabel">   <Stack Panel Name="MyStackPanel">      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />   </StackPanel></Label>
In diesem Codebeispiel wird darstellt die Count -Eigenschaft die Eigenschaft P. Darüber hinaus Objekt X wird durch UIElementCollection -Klasse in der Form der StackPanel.Children -Eigenschaft dargestellt.

Im Abschnitt "Ursache" die erste Bedingung ist erfüllt, da Objekt X bezieht sich auf die untergeordneten Elemente des Objekts X. Diese untergeordneten Elemente enthalten das Bindungsziel und Bindungsziel TextBlock -Elements ist.

Im Abschnitt "Ursache" die zweite Bedingung ist erfüllt, weil-Eigenschaft P ist keiner DependencyProperty -Objekt und Objekt X implementiert die INotifyPropertyChanged -Schnittstelle nicht. Dieses Verhalten bewirkt, dass die UIElementCollection -Klasse und der TextBlock -Element, die nicht freigegeben werden. StackPanel -Container-Klasse wird außerdem nicht freigegeben, da die UIElementCollection -Klasse einen Verweis auf den StackPanel -Container-Klasse enthält. Dieses Verhalten tritt auf, auch wenn die UIElementCollection -Klasse und der TextBlock -Element aus der Hauptstruktur entfernt werden, mithilfe der folgenden Codezeile:
MyLabel.Content = <Some New Content>;

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 938416 – Letzte Überarbeitung: 03/29/2013 06:12:00 – Revision: 3.0

Microsoft .NET Framework 3.0

  • kbtshoot kbprb kbmt KB938416 KbMtde
Feedback
async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write("