2015-12-04 22 views
1

Я использую mvvm light на моем проекте. Для связи между представлениями я использую GalaSoft.MvvmLight.Messaging.Messenger, но он работает не так, как ожидалось.
Код ниже:
Регистрация гонцаMVVM не получает сообщение

GalaMessenger.Default.Register<ServerNewMessenger>(ServiceLocator.Current.GetInstance<ServerNewViewModel>(), (msg) => 
      { 
       Debug.Write("Click"); 
      }); 

Отправить гонца к приемнику

Messenger.Default.Send<ServerNewMessenger>(newItem, ServiceLocator.Current.GetInstance<ServerNewViewModel>()); 

Я никогда не получить сообщение. Но когда я удаляю получателя по методу отправки:

Messenger.Default.Send<ServerNewMessenger>(newItem); 

Тогда он отлично работает. Зачем?

+0

Очень важно инициализировать класс/функцию, которая имеет значение Default.Register перед Default.Send. Это может быть ваша проблема. Проверь это. – A191919

+0

Да, я выполнил Default.Register перед Default.Send. –

+0

Позволяет ли вызов GetInstance возвращать другой экземпляр для каждого вызова? –

ответ

1

Вы сбиты с толку о перегрузках Register и Send. В вашем втором примере, вы используете эту перегрузку Send:

void Send<TMessage>(TMessage message, object token); 

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

void Register<TMessage>(object recipient, Action<TMessage> action); 

Вы не задаете нет маркеров, так что ваш объект не получит.

Если действительно вы хотите отправить это сообщение только ваш ServerNewViewModel, использовать уникальный маркер вроде GUID или какой-либо строки, которые вы составляете:

string token = "YourServerViewModelToken"; 
var serverNewViewModel = ServiceLocator.Current.GetInstance<ServerNewViewModel>(); 
GalaMessenger.Default.Register<ServerNewMessenger>(serverNewViewModel, token, (msg) => 
    { 
     Debug.Write("Click"); 
    }); 

Затем, когда вы посылаете его, использовать тот же токен:

string token = "YourServerViewModelToken"; 
Messenger.Default.Send<ServerNewMessenger>(newItem, token); 
+0

Большое спасибо. –

Смежные вопросы