Слушатель MVVM Light не выпускает / детерминистическое завершение для зарегистрированного объекта? - PullRequest
4 голосов
/ 12 июня 2011

У меня есть дочернее окно со связанной виртуальной машиной, которое создается каждый раз, когда я прошу дочернее окно открыться. когда дочернее окно открывается, оно регистрирует слушателя для легкого сообщения MVVM. После закрытия окна я почти уверен, что освобождаю все ссылки на него, но на самом деле я не вызываю dispose, потому что он не реализует IDisposeable.

Когда я создаю другое дочернее окно того же типа и отправляю ему другой контекст, я знаю, что получаю сообщение из предыдущего экземпляра виртуальной машины ... каждый раз, когда я использую окно, все больше и больше ВМ слушает, и код повторяется.

Как я могу быть уверен, что моя предыдущая виртуальная машина, которая зарегистрировалась для прослушивания сообщения, действительно была освобождена и больше не активна. Есть ли детерминированный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 13 июня 2011

Всякий раз, когда вы регистрируете сообщение, вы должны убедиться, что вы также отменили регистрацию сообщения. Для отмены регистрации вы можете использовать метод Cleanup для классов, производных от ViewModelBase. В других случаях, например представление, вы должны реализовать метод, который вызывается, когда представление выгружается, например путем захвата и обработки выгруженного события в элементе управления или представлении. В этом методе вы затем вызываете Messenger.Unregister(EventTarget).

Это поведение является причудой в текущей версии инструментария, и Лоран знает об этом.

1 голос
/ 13 июня 2011

Как вы кодировали обработчик для сообщения в ВМ?Похоже, вы, вероятно, указываете на метод внутри той же виртуальной машины, которая регистрирует сообщение.Это заставляет класс Messenger поддерживать ссылку на ВМ и предотвращать ее сборку мусора ( см. Здесь для обсуждения ).Существует два решения: реализовать IDisposable и отменить регистрацию всех сообщений для вашего экземпляра виртуальной машины или просто отменить регистрацию всех сообщений из экземпляра виртуальной машины при закрытии дочернего диалога.Лично я бы сделал и то, и другое, чтобы обеспечить освобождение всей сети объекта.

0 голосов
/ 12 июня 2011

Вы можете использовать либо метод очистки, либо вручную отменить регистрацию сообщения. Для более подробной информации нажмите здесь .

...