首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF MVVM DataBindings停止更新

WPF MVVM DataBindings停止更新
EN

Stack Overflow用户
提问于 2012-09-10 15:45:22
回答 2查看 1.5K关注 0票数 20

我正在开发一个使用MVVM模式的中型WPF应用程序。ViewModels使用INotifyPropertyChanged刷新各自的视图。

这种方法非常有效,除了一个问题:当这个应用程序长时间运行(3-7天)时,视图(整个应用程序中的每个视图!)突然停止更新它们的绑定属性。

如果我在ViewModels中设置了一个断点,他们就会高兴地走开,给PropertyChanged打电话,好像什么都没有错一样。但是,如果我在视图绑定到的某个ViewModel对象的getter中设置了一个断点,则不会调用getter!

我对此感到困惑,甚至不知道如何正确地调试这个问题。我已经检查了Visual输出窗口中的数据绑定错误,但是一切看起来都正常。这就好像WPF数据绑定引擎在后台崩溃了一样。这个应用程序也在监控未处理的异常(AppDomain.UnhandledExceptionDispatcher.UnhandledException),但是没有异常被抛出。

摘要:经过很长一段时间,视图停止更新它们的数据绑定,但是ViewModels仍然在调用PropertyChanged事件.

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2012-11-09 19:33:13

经过几个月的调试,我终于能够通过将调试器附加到远程目标来解决这个问题。只有到那时,它才会产生一个我可以调试的异常。我仍然不明白为什么AppDomain.UnhandledException和Dispatcher.UnhandledException没有捕捉到这个异常,但至少我能够找到它。

票数 3
EN

Stack Overflow用户

发布于 2012-09-12 18:04:03

你可能是过度热心的弱引用的牺牲品。您的MVVM框架可能有一个修复程序。如果没有,这些信息可能会帮助您在源代码中找到问题。

在大多数INotifyPropertyChanged实现中都存在一个已知的内存泄漏。视图模型对XAML控件的PropertyChanged处理程序的委托进行硬引用。然后,该委托将对XAML控件进行硬引用。因此,只要视图模型存在,就无法收集控件。

因此,为了解决这个问题,许多MVVM框架使用事件的弱引用。虽然这可以修复内存泄漏,但也会导致您所看到的问题。如果弱事件没有正确实现,则可能在实际收集XAML控件之前将其删除。

我怀疑您使用的是带有弱引用的MVVM框架,并且它们正在过早地处理。要查看这是否是一个可能的问题,只需对GC.Collect()进行几次调用,并查看问题是否更频繁地发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12355087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档