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