当您在 Windows 演示基础使用数据绑定时,可能会发生内存泄漏

文章翻译 文章翻译
文章编号: 938416 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

当您使用数据绑定在 Microsoft Windows 演示基础 (适用于 WPF) 时,可能会发生内存泄漏。

原因

如果满足下列条件,则会出现此问题:
  • 数据绑定的路径是指对象 XP 属性。
  • 对象 X 包含直接引用或间接引用了数据绑定操作的目标。
  • 通过 PropertyDescriptor 对象而不是一个 DependencyProperty 对象或 $ PropertyInfo 对象的访问属性 P

替代方法

要变通解决此问题,使用下列方法之一。

方法 1

通过 DependencyProperty 对象访问属性 P

方法 2

公开对象 X 上的 INotifyPropertyChanged 接口。

方法 3

将数据绑定的模式设置为 OneTime

状态

此行为是设计使然。

更多信息

在 WPF 中,不标记为 OneTime 必须侦听属性的一个数据绑定操作从源对象 (对象 X) 更改通知。 WPF 从 INotifyPropertyChanged 界面使用 DependencyProperties 类的内置通知。

如果 DependencyProperties 类和 INotifyPropertyChanged 接口都不可用,WPF 使用 ValueChanged 事件。 此行为涉及到与属性 P 相对应的 PropertyDescriptor 对象上调用 PropertyDescriptor.AddValueChanged 方法。 遗憾的是,此操作会导致公共语言运行库 (CLR) 可以创建从此 PropertyDescriptor 对象 X 的强引用。 CLR 还保留全局表中的 PropertyDescriptor 对象的引用。 此行为会导致引用链以下列顺序发生:
  1. 全局表
  2. PropertyDescriptor 对象
  3. Object X
  4. 数据绑定目标

    注意该对象 X 和数据绑定目标之间的引用是由"原因"部分中列出的第一个条件引起的。
  5. 绑定
只要使用数据绑定目标,绑定必须继续侦听的更改。 此行为使引用之间 PropertyDescriptor 对象处于活动状态和对象 X,并且目标仍保留在使用中。 对象 XX 所引用的对象的每个对象中,此行为将导致内存泄漏。 这些对象包括数据绑定目标。

解决方法 1 和解决方法方法 2 导致 WPF 使用首选的通知机制之一。 解决方法方法 3 指示 WPF 不为侦听的更改通知。 所有三种解决方法方法避免创建之间 PropertyDescriptor 对象引用和对象 X

在下面的代码示例创建了泄漏的条件
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
此的代码示例在 Count 属性表示属性 P。此外,对象 X 表示由 UIElementCollectionStackPanel.Children 属性的窗体中的类。

在"原因"部分中的第一个条件得到满足,因为对象 X 所引用对象 X 的子级的。这些子项包括绑定目标和绑定目标是 TextBlock 元素。

在"原因"部分中的第二个条件得到满足,因为属性 P 不是一个 DependencyProperty 对象和对象 X 不实现 INotifyPropertyChanged 接口。 此行为将导致 UIElementCollection 类和 TextBlock 元素不能发布。 此外,StackPanel 容器类不是释放,因为 UIElementCollection 类包含 StackPanel 容器类的引用。 即使 UIElementCollection 类和 TextBlock 元素从主树删除通过使用下面的 code:
MyLabel.Content = <Some New Content>;

属性

文章编号: 938416 - 最后修改: 2007年7月26日 - 修订: 1.1
这篇文章中的信息适用于:
  • Microsoft .NET Framework 3.0
关键字:?
kbmt kbtshoot kbprb KB938416 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 938416
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com