WPF MVVM DataBindings停止更新

时间:2012-09-10 15:45:22

标签: c# wpf data-binding mvvm inotifypropertychanged

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

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

如果我在ViewModels中设置了一个断点,那么他们就会愉快地开玩笑,调用PropertyChanged就像没有错。但是,如果我在View绑定的ViewModel对象的getter中设置断点,则永远不会调用getter!

我很难过,甚至不知道如何正确调试这个问题。我已检查Visual Studio输出窗口是否存在数据绑定错误,但一切看起来都很正常。几乎就像WPF数据绑定引擎在后台崩溃一样。此应用还会监控未处理的异常(AppDomain.UnhandledExceptionDispatcher.UnhandledException),但不会抛出异常。

摘要:经过很长一段时间后,视图停止更新其数据绑定,但ViewModel仍在调用PropertyChanged事件。

任何建议???

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

在大多数INotifyPropertyChanged实现中存在已知的内存泄漏。视图模型对XAML控件的PropertyChanged处理程序的委托进行了硬引用。该代表反过来对XAML控件进行了硬性参考。因此,只要视图模型存在,就无法收集控件。

因此,要解决此问题,许多MVVM框架都使用weak references for events。虽然这可以解决内存泄漏问题,但它也可能导致您遇到的问题。如果未正确实现弱事件,则可能在实际收集XAML控件之前将其删除。

我怀疑你正在使用带有弱引用的MVVM框架,并且它们过早地被处理掉了。要查看这是否可能存在问题,请对GC.Collect()进行一些调用,然后查看问题是否更频繁发生。