Artikel-ID: 938416 - Geändert am: Donnerstag, 26. Juli 2007 - Version: 1.1

Bei Verwendung von Datenbindung in WPF kann ein Speicherverlust auftreten

SystemtippDieser Artikel bezieht sich auf ein anderes Betriebssystem als das von Ihnen verwendete. Für Sie möglicherweise nicht relevante Artikelinhalte wurden deaktiviert.

Auf dieser Seite

Alles erweitern | Alles schließen

Problembeschreibung

Wenn Sie die Datenbindung in Microsoft Windows Presentation Foundation (WPF) verwenden, kann ein Speicherverlust auftreten.

Ursache

Dieses Problem tritt auf, wenn folgenden Bedingungen erfüllt sind:
  • Ein Datenbindung Pfad bezieht sich auf Eigenschaft P von Objekt X.
  • X-Objekt enthält einen direkten Verweis oder einen indirekten Verweis auf das Ziel der Operation die Datenbindung.
  • Eigenschaft P wird über ein PropertyDescriptor -Objekt anstelle eines DependencyProperty -Objekts oder eine PropertyInfo -Objekt zugegriffen.

Abhilfe

Wenden Sie eines der folgenden Verfahren an, um dieses Problem zu umgehen.

Methode 1

Greifen Sie über ein DependencyProperty -Objekt Eigenschaft P auf.

Methode 2

Machen Sie die INotifyPropertyChanged -Schnittstelle auf Objekt X verfügbar.

Methode 3

Legen Sie den Modus von der Datenbindung auf OneTime .

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

In WPF Änderungsbenachrichtigungen Datenbindungsoperation, die als OneTime für Eigenschaft überwachen muss nicht gekennzeichnet ist aus dem Quellobjekt (X-Objekt). 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. Dies umfasst das Aufrufen der PropertyDescriptor.AddValueChanged -Methode für das PropertyDescriptor -Objekt, das Eigenschaft P entspricht. Leider wird dieses Aktion die common Language Runtime (CLR) um einen starken Verweis von diesem PropertyDescriptor Objekt zu Objekt X erstellen. Die CLR behält auch einen Verweis auf das PropertyDescriptor -Objekt in eine globale Tabelle. Dieses Verhalten führt eine Kette Verweis in der folgenden Reihenfolge auftreten:
  1. Globale Tabelle
  2. PropertyDescriptor -Objekt
  3. Object X
  4. Das Ziel die Datenbindung

    Hinweis: Die Referenz zwischen Objekt X und dem Ziel die Datenbindung wird durch die erste Bedingung verursacht, das im Abschnitt "Ursache" aufgeführt ist.
  5. Bindung
Solange das Ziel die Datenbindung verwendet wird, muss die Bindung weiterhin Änderungen überwacht. Dieses Verhalten bleibt den Verweis zwischen PropertyDescriptor -Objekts und X-Objekt, und das Ziel bleibt, verwendet. Dieses Verhalten führt einen Speicherverlust in Objekt X und jedes Objekt, auf welches Objekt X verweist. Diese Objekte umfassen das Ziel die Datenbindung.

Problemumgehung Methode 1 und Problemumgehung Methode 2 führen WPF eines bevorzugten Benachrichtigungsmechanismen verwenden. Problemumgehung Methode 3 weist WPF nicht zur Überwachung von Änderungsbenachrichtigungen. Alle drei Problemumgehung Methoden vermeiden Bezug zwischen den PropertyDescriptor -Objekt erstellen und X-Objekt.

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

Die erste Bedingung in Abschnitt "Ursache" ist erfüllt, da Objekt X auf die untergeordneten Elemente des Objekt X verweist. Diese untergeordneten Elemente enthalten das Bindungsziel, und das Bindungsziel ist TextBlock -Element.

Die zweite Bedingung in den Abschnitt "Ursache" ist erfüllt, da Eigenschaft P kein DependencyProperty -Objekt ist und Objekt X nicht die INotifyPropertyChanged -Schnittstelle implementiert. Dieses Verhalten führt die UIElementCollection -Klasse und das TextBlock -Element nicht freigegeben werden. Die StackPanel -Container-Klasse wird außerdem nicht freigegeben, da die UIElementCollection -Klasse einen Verweis auf die StackPanel -Container-Klasse enthält. Dieses Verhalten tritt selbst dann, wenn die UIElementCollection -Klasse und der TextBlock -Element aus der Hauptstruktur entfernt werden mithilfe des code:
MyLabel.Content = <Some New Content>;


Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 3.0
Keywords: 
kbmt kbtshoot kbprb KB938416 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
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  (http://support.microsoft.com/kb/938416/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.