2010-09-13 4 views
3

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

+0

Куда отправлено ваше сообщение? Вы перешли через источник MVVM Light, чтобы узнать, почему сообщение отправляется несколько раз? Есть определенная работа, которую вы можете сделать, или более подробную информацию, которую вы можете предоставить, прежде чем на ваш вопрос будет дан ответ. –

ответ

1

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

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

+0

Я нашел для своей проблемы хотя бы потому, что другие модели и взгляды видят в памяти. У меня все еще есть одна проблема, когда мне нужно отправить сообщение из vm в представление. Моя проблема заключается в том, что все предыдущие экземпляры этого представления все еще хранятся в памяти, поэтому сообщение отправляется и получает несколько раз – Jason

8

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

Таким образом, для ViewModels: убедитесь, что вы вызвали очистку после того, как сделали (или реализуете IDisposable и вызывают очистку оттуда).

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

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

+1

... за исключением того, что в WPF событие UserControl.Unloaded не гарантируется увольнением в соответствии с http://connect.microsoft.com/VisualStudio/feedback/details/575287/the-usercontrol-unloaded-event-is-not-raised-when-the-mainwindow-gets-closed - так что это не так просто. –

+0

То, что я делаю, заключается в том, что вам нужно очистить почтовый ящик, иначе он будет обрабатывать сообщения, хотя он больше не должен этого делать. Событие Unloaded - одно место, но оно может быть не единственным или лучшим. – AxelEckenberger

5

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

static bool isRegistered = false;

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

if(!isRegistered) 
{ 
    Messenger.Default.Register<MyMessage>(this, OnMessageReceived); 
    isRegisterd = true; 
} 
+0

Это вероятное решение проблемы и не регистрирует Messenger в конструкторе. –

1

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

0

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

<Page 
    ........ 
    ........ 
    NavigationCacheMode="Required"> 
Смежные вопросы