Подтвердить что ты не робот

WPF MVVM DataBindings прекращает обновление

Я работаю над средним WPF-приложением, использующим шаблон MVVM. ViewModels используют INotifyPropertyChanged для обновления своих соответствующих представлений.

Этот подход работает отлично, за исключением одной проблемы: когда это приложение остается запущенным в течение длительных периодов времени (3-7 дней), Views (каждый просмотр во всем приложении!) внезапно перестает обновлять связанные свойства.

Если я установил точку останова в ViewModels, они с радостью отрываются, называя PropertyChanged, как будто ничего не случилось. Однако, если я установил точку останова в получателе одного из объектов ViewModel, с которым связан вид, то getter никогда не вызывается!

Я сейчас в тупике и даже не знаю, как правильно отладить эту проблему. Я проверил окно вывода Visual Studio для ошибок привязки данных, но все выглядит нормально. Это почти как если бы механизм привязки данных WPF разбился в фоновом режиме. Это приложение также отслеживает необработанные исключения (AppDomain.UnhandledException и Dispatcher.UnhandledException), но исключений не возникает.

Резюме. После длительных периодов времени представления перестают обновлять свои привязки данных, но ViewModels все еще вызывают событие PropertyChanged.

Любые советы???

4b9b3361

Ответ 1

После нескольких месяцев отладки я наконец смог решить проблему, присоединив отладчик к удаленной цели. Только тогда это создало исключение, которое я мог бы отлаживать. Я до сих пор не понимаю, почему AppDomain.UnhandledException и Dispatcher.UnhandledException не поймали это исключение, но, по крайней мере, я смог понять это.

Ответ 2

Вы можете стать жертвой чрезмерно усердных слабых ссылок. Возможно, исправление для вашей среды MVVM. Если нет, эта информация может помочь вам найти проблему в исходном коде.

В большинстве реализаций INotifyPropertyChanged существует известная утечка памяти. Модель представления принимает жесткую ссылку на делегата элемента управления XCML PropertyChanged. Этот делегат, в свою очередь, серьезно ссылается на элемент управления XAML. Из-за этого элемент управления не может быть собран до тех пор, пока существует модель представления.

Итак, чтобы исправить эту проблему, многие фреймворки MVVM используют слабые ссылки для событий. Хотя это может устранить утечку памяти, это также может вызвать проблему, которую вы видите. Если слабое событие неправильно реализовано, оно может быть удалено до того, как элемент управления XAML будет фактически собран.

Я подозреваю, что вы используете структуру MVVM со слабыми ссылками и что они становятся преждевременными. Чтобы узнать, является ли это вероятной проблемой, поместите несколько вызовов в GC.Collect() и посмотрите, происходит ли проблема чаще.