MVVM Light Messenger выполняется несколько раз - PullRequest
3 голосов
/ 13 сентября 2010

Я использую MVVM Light и использую сообщения для связи между ViewModel, чтобы сообщить ViewModel, когда можно выполнить что-либо Моя проблема в том, что я регистрируюсь на сообщение, а затем оно получает его несколько раз. поэтому, чтобы моя программа не выполняла что-то более одного раза, мне нужно создать логические флаги, чтобы увидеть, было ли это уже получено. Есть идеи, почему он это делает и как я могу это остановить?

Ответы [ 5 ]

8 голосов
/ 14 июня 2011

Убедитесь, что вы отменили регистрацию ваших обработчиков сообщений, когда они вам больше не нужны.Messenger хранит ссылку на зарегистрированные методы, и это предотвращает их сборку мусора.

Поэтому для ViewModels: убедитесь, что вы вызвали Cleanup, как только вы это сделали (или реализуете IDisposable и оттуда вызовете Cleanup).1003 *

Для представлений (элементы управления, Windows или аналогичные) вызовите Messenger.Unregister в событии, которое происходит при разложении представления, например, в событие Unloaded.

Это известное поведение MVVMи обсуждался в нескольких местах.

6 голосов
/ 21 марта 2013

Очень старый вопрос, но я решил проблему следующим образом:

static bool isRegistered = false;

и затем в конструкторе:

if( !isRegistered )
{
   Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
   isRegisterd = true;
}
1 голос
/ 31 октября 2013

действительно старый, но думал, что я отвечу на всякий случай, если это кому-то нужно.В то время я был довольно новичком в Silverlight, и проблема закончилась утечкой памяти, поскольку viewModel, у которого было несколько экземпляров, все еще находился в памяти.

1 голос
/ 17 сентября 2010

Я видел эту проблему раньше. Это было связано с вызовом Messenger.Default.Register более одного раза. Класс MVVMLight Messenger будет регистрировать один и тот же элемент «x» количество раз. Вот почему, когда вы звоните «Отправить», вы получаете его много раз.

Кто-нибудь знает, как предотвратить многократную регистрацию MVVMLight?

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

Как упоминали другие участники, одно и то же сообщение регистрируется несколько раз.Я заметил, что это происходит при переходе к View X, а затем обратно к View Z, где сообщение зарегистрировано в конструкторе Z ViewModel.Одно из решений - установить для свойства NavigationCacheMode значение Обязательное

<Page
  ........
  ........
  NavigationCacheMode="Required">
...