我试图弄清楚为什么我的一些 Silverlight 控件会留在内存中。我注意到,当我离开打开控件的页面时,仍然存在指向视图模型的引用链接。这些链接是对在页面和视图模型之间创建绑定时创建的 ErrorsChanged 事件(我的视图模型实现 INotifyDataError)的剩余订阅的结果。在某些时候,一些但不是所有的绑定都被删除了,我无法弄清楚为什么这没有发生。
在 Silverlight UIElements 的生命周期中,现有绑定在什么时候被删除?
我试图弄清楚为什么我的一些 Silverlight 控件会留在内存中。我注意到,当我离开打开控件的页面时,仍然存在指向视图模型的引用链接。这些链接是对在页面和视图模型之间创建绑定时创建的 ErrorsChanged 事件(我的视图模型实现 INotifyDataError)的剩余订阅的结果。在某些时候,一些但不是所有的绑定都被删除了,我无法弄清楚为什么这没有发生。
在 Silverlight UIElements 的生命周期中,现有绑定在什么时候被删除?
我想我现在知道了这个问题的答案。如果我错了,请纠正我。绑定不会被删除。相反,作为绑定的特定实例化的结果,建立了引用链接(例如,连接了 INotifyDataError 事件)。在最简单的情况下,DataContext 发生变化。
假设您在加载时将 Page 的 DataContext 设置为一个新的、不同的 INotifyDataError 对象。如果您的页面上有绑定(到 DataContext),则在销毁 DataContext 对象之前,该页面不是垃圾收集的候选对象。这是因为 DataContext 通过其 ErrorsChanged 事件持有对 Page 的引用。如果要收集 DataContext 对象,则必须在 Page 的 Unloaded 事件中将 DataContext 设置为 null。
据我了解,似乎实现 DataContext(与页面不同)的正确模式是在页面上的 Loaded 事件中设置 DataContext,然后在页面触发其 Unloaded 事件时将 DataContext 设置为 null . 这个概念适用于任何框架元素。
顺便说一句,我还没有深入研究元素绑定。例如,当 Page 上的一个元素绑定到另一个元素上的属性时。我不确定这些对象之间的引用链接何时被删除。我假设它是在页面被卸载的时候。有人知道这个问题的答案吗?