如何解决MVVM Light Listener是否不释放/确定对象的确定性终结?
| 我有一个带有关联虚拟机的子窗口,每次要求打开子窗口时都会创建该子窗口。当子窗口打开时,它将为MVVM Light消息注册一个侦听器。关闭窗口后,我非常确定要释放对它的所有引用,但是由于它没有实现IDisposeable,所以我实际上没有调用dispose。 当我实例化另一个相同类型的子窗口并发送不同的上下文时,我知道我正在从先前实例化的VM收到消息...每次使用该窗口时,越来越多的VM听,代码重复。 如何确定我先前注册的用于侦听消息的VM实际上已被释放并且不再处于活动状态。有确定的方法可以做到这一点吗?解决方法
每当您注册一条消息时,都应确保也注销该消息。要取消注册,可以对源自
ViewModelBase
的类使用Cleanup
方法。在其他情况下,例如视图时,应实现在视图卸载时调用的方法hat,例如,通过捕获和处理控件或视图上的unload事件。然后用这种方法调用you2ѭ。
在当前版本的工具包中,此行为是一个怪癖,Laurent意识到了这一点。
, 您如何为VM中的消息处理程序编码?听起来您可能正在将其指向正在注册消息的同一VM内的方法。这将导致Messenger类维护对VM的引用并防止对其进行垃圾回收(请参阅此处的讨论)。有两种解决方案:实现IDisposable并注销您的VM实例的所有消息,或者仅在子对话框关闭时注销VM实例中的所有消息。我个人都希望确保发布整个对象网络。
, 您可以使用清除方法,也可以手动注销邮件。有关更多详细信息,请单击此处。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。