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