Правильно ли работает незарегистрированная mvvm light v3? - PullRequest
1 голос
/ 03 августа 2011

Есть ли проблема с отменой регистрации MvvM-Light v3?

Я регистрируюсь так:

 Messenger.Default.Register<DialogResponse>(this,
                                            MessageTypesUI.YesNoQueryResponse,
                                            AnswerResponse);

Тогда в "AnswerResponse"

 Messenger.Default.Unregister<DialogResponse>(MessageTypesUI.YesNoQueryResponse);

Оба метода выполняются, и вызывается AnswerResponse, но во второй раз он вызывается дважды, а третий - трижды и т. Д.

Это действует так, как будто мой "незарегистрированный" игнорируется.

Я пробовал это как с Unregister (), так и с простой старой Unregister ()

В примечаниях к выпуску V4 было что-то, из-за чего я заподозрил проблему с отменой регистрации версии 3 ...

1 Ответ

6 голосов
/ 03 августа 2011

Вы должны изменить вызов Unregister, чтобы передать объект получателя, а не тип сообщения:

Messenger.Default.Unregister<DialogResponse>(this);

Если вы посмотрите на MVVM Light code для мессенджера, все действия отмены регистрации используют получателя - поскольку внутренне получатель используется для определения, какие обработчики сообщений будут удалены. Самый базовый метод - Unregister(recipient), который отменяет регистрацию всех действий для данного получателя. Все дополнительные параметры допускают более мелкозернистый подход.

Если у вас есть несколько действий, обрабатывающих один и тот же тип сообщения, и вы хотите отменить регистрацию только одного из них, вы можете использовать

Messenger.Unregister<DialogMessage>(recipient, action);

чтобы удалить только одно из действий.

Редактировать

Примечания к выпуску MVVM Light для V. 4 указывают на следующие изменения в Messenger:

  1. Недостающие методы при добавлении в. Интерфейс IMessenger.
  2. Добавлен дополнительный метод отмены регистрации, позволяющий использовать токены для фильтрации.
  3. Метод Messenger.CleanupList стал потокобезопасным.
...