WPF MVVM DataBindings停止更新

sha*_*sen 20 c# data-binding wpf mvvm inotifypropertychanged

我正在使用MVVM模式的中型WPF应用程序.ViewModels用于INotifyPropertyChanged刷新各自的视图.

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

如果我在ViewModels中设置一个断点,那么它们就会快乐地走开,呼唤PropertyChanged就像没有错.但是,如果我在View绑定的ViewModel对象的getter中设置断点,则永远不会调用getter!

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

简介:经过很长一段时间后,Views停止更新其数据绑定,但ViewModel仍在调用PropertyChanged事件.

任何建议???

Mic*_*rry 1

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

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

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

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