1

我有一个自定义 UserControl (MyView),其中包含一个名为 Header 的 DependencyProperty。此用户控件是其他几个用户控件(视图)的一部分。通过DataTemplate解决

<!-- SomeView's resources -->
<DataTemplate DataType="{x:Type vm:MyViewModel">
  <vw:MyView Header="{StaticResource myViewHeader}" />
</DataTemplate>

一些包含 MyView 的视图正在为 MyView 的 Header 传递相同的资源。出于这个原因,我将 myvIewHeader 放在全局可用资源(应用程序资源)中。

让资源全局可用会导致内存泄漏,因为 MyView 永远不会被垃圾收集。

但是,如果我将 Header 资源放在容器的(例如 SomeView 的)资源中,那么一切都会被正确清理。

为了让 MyView 在为 Header 使用全局可用资源时不会导致内存泄漏,我需要在 MyView 的 Unloaded 事件中将 Header 设置为 null:

this.Unloaded += (s, e) =>
  {
    this.SetValue(HeaderProperty, null);
  };

我的问题是:为什么会发生这种情况,我做事是否正确,或者我应该以其他(更好)的方式实现这一目标?

4

0 回答 0