当我们的 ViewModel 是静态对象时,WPF 防止内存泄漏

WPF Prevent memory leaks when our ViewModel is a static object

我现在 WPF 编码中有些东西可能会导致 Memory leaks。例如删除对象包含订阅 long life 资源的事件处理程序。在这方面,我已经阅读了this article

现在,我的问题是:

如果我们的资源是 ViewModel 并且我们将其保存在 Static 对象中并将其提供给 Window DataContextDataContext UserControlWindow 里面,当我们想要 Close 我们的 Window 时,我们应该做 所有 以下工作来防止 Memory leaks? :

如果答案是肯定的,您建议使用一种或几种方法自动完成这些工作,然后在 Window Closing 上调用它们。

  • 从 ViewModel 事件中手动取消订阅 Window 或 UserControl 的所有事件处理程序

是的。如果 window 订阅了 VM 事件,则 VM 将保存对订阅者的引用。请注意,这不是 WPF 独有的,任何静态对象都会像这样保存事件引用。如果你不想手动退订那么你可以使用Weak Event Pattern。一般来说,我觉得取消订阅更简单。

  • 手动取消绑定所有元素属性到 ViewModel
  • 手动取消绑定所有绑定到 ViewModel 的命令

不,通常您不需要担心绑定。唯一的情况是绑定对象不是 DependencyProperty 或实现 INotifyPropertyChanged 的​​东西。因为在 MVVM 中,您通常绑定到 VM 属性,而 VM 实现 INPC,所以您没问题。

因此,始终在您的 VM 中实施 INPC 是一种很好的做法,即使您从未启动过它也是如此。我过去有过泄漏,我没有为 INPC 烦恼,因为 VM 属性在构造后永远不会改变。

其他要看的只有文中给出的例子,比如Count。但是,这些很少给我带来问题。如果您确实发现自己存在内存泄漏,那么您可以使用 this answer 中概述的工具来找出罪魁祸首。