【发布时间】:2011-08-12 07:26:09
【问题描述】:
我正在考虑开始使用 MVVM Light,并且遇到了“新”ICleanup 界面。我只是想知道您何时会清理 VM...当您离开该页面时?
另外,我看到 ViewModelLocator 中有一个 Main Cleanup,它应该清理所有 VM...什么时候使用它?
非常感谢
问候, 毛罗
【问题讨论】:
标签: mvvm-light
我正在考虑开始使用 MVVM Light,并且遇到了“新”ICleanup 界面。我只是想知道您何时会清理 VM...当您离开该页面时?
另外,我看到 ViewModelLocator 中有一个 Main Cleanup,它应该清理所有 VM...什么时候使用它?
非常感谢
问候, 毛罗
【问题讨论】:
标签: mvvm-light
ICleanup 接口相对于IDispose 实现(以前存在)的优势在于 - 正如 Laurent 所说 - 您可以更频繁地调用它,而无需将 VM 标记为已处置。这意味着,当您想要/需要取消注册 VM 的消息处理时,您应该调用 ICleanup.Cleanup。显然,在这种情况下,您需要有一个方法来在以后需要时再次注册所有消息处理程序。
就个人而言,我更喜欢IDispose 处理VM 清理的方式,尤其是当我倾向于IOC 容器时。但是,我可以看到 Laurent 的案例,并且在 VM 上实现 IDisposable 调用 Cleanup 并非易事。
通常,处置/清理 VM 的时间点取决于它的实例化方式和对象的生命周期。这些决定取决于您的应用程序设计,并且没有明确的指导说明何时您应该这样做。但请记住,每当您在视图模型中注册消息处理程序时,它必须完成 - 在其他情况下,它并不是严格需要的。
在谈论消息处理程序时,不要忘记在您的视图中取消注册它们,当您在那里注册消息处理程序时(请参阅this post)。 - 再想一想,我将代码放在这里以使其清楚并以供将来参考:
在您的视图的构造函数中的代码隐藏文件中添加以下代码,以确保在卸载视图时释放注册的消息处理程序:
public MyView() {
this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}
【讨论】: