c# - 删除 XAML 用户控件上的 DataContextChanged/Loaded 事件处理程序

标签 c# wpf event-handling datacontext

为了减少内存泄漏,我试图弄清楚在向 XAML 用户控件上的“DataContextChanged”事件或“Loaded”事件添加处理程序后,即 (UserControl.xaml.cs):

    public MyUserControl()
    {
        InitializeComponent();
        DataContextChanged += new DependencyPropertyChangedEventHandler(MyUserControl_DataContextChanged);
        Loaded += new RoutedEventHandler(MyUserControl_Loaded);
    }

如果我需要删除它。 WPF 会处理这个问题,还是我需要手动删除它们?

最佳答案

简短的回答——没有。

您只需要在处理程序使对象保持根目录时删除处理程序,这意味着阻止其垃圾收集。如果您创建子对象并将其事件处理程序之一指向父对象,则不会发生这种情况,因为没有对子对象的悬空引用。

如果您创建一个子对象并且父对象将其事件处理程序之一指向子对象,它将会发生,因为现在父对象有一个对将保留它的子对象的引用活着( Root )。

在您上面指定的情况下,它完全是内部的——您在类中添加了对您自己的类的引用。当用户控件被销毁时,它不会在另一个类的事件处理程序中有引用。因此您不需要删除事件处理程序。

关于c# - 删除 XAML 用户控件上的 DataContextChanged/Loaded 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792157/

相关文章:

c# - 资源 (.resx) 文件有什么好处?

c# - 如何从.Min扩展方法获取对象?

c# - 如何在 Windows Phone 7 的 C# 中延迟方法?

c# - WPF 中的 SerialPort 抛出 I/O 异常

wpf - 更改卡住对象的可见性?

c# - Netstandard 无法从 nuget System.Net.Http 转换为 GAC 版本

c# - 使用 DocumentPaginator 打印时如何打印预览?

ios - 在 iOS 中切换 userInteractionEnabled 属性时遇到问题

asp.net - 为什么 IE 为具有鼠标悬停处理程序的服务器端元素添加 jQuery 属性?

javascript - 通过引用将字符串传递到方法中