2013-08-06 3 views
6

Может ли кто-нибудь быть таким любезным, чтобы объяснить Messenger MVVM Light для меня? Я читал сообщение о StackOverflow здесь: MVVM pass values between view models пытаясь получить это. Документация на MVVM Light не так хороша в данный момент, поэтому я совершенно не уверен, куда идти.Использовать посланник MVVM Light для передачи значений между View Model

Скажем, у меня есть две модели ViewModels и ViewModelLocator. Я хочу иметь возможность передавать параметры между всеми тремя без проблем. Как я буду делать это с посланником? Он способен на это?

Редактировать: Вот моя новая реализация. На данный момент, похоже, что MessengerInstance не требует токена. Я ужасно смущен.

В первом ViewModel:

MessengerInstance.Send<XDocument>(SelectedDocument); 

А во втором:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc)); 

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

+0

«, но визуальная студия получает меньше сердиться меня, когда я это делаю ». Ха. Это заставило меня усмехнуться. :) –

ответ

12

Скажем, у меня есть две модели ViewModels и ViewModelLocator. Я хочу иметь возможность передавать параметры между всеми тремя без проблем. Как я буду делать это с посланником? Он способен на это?

Это именно то, для чего оно предназначено, да.

Чтобы отправить сообщение:

MessengerInstance.Send(payload, token); 

Чтобы получить сообщение:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload)); 

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

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

Например:

public enum MessengerToken 
{ 
    BrushChanged, 
    WidthChanged, 
    HeightChanged 
} 

Тогда ваш отправить/получить было бы что-то вроде:

// sending view model 
MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged); 

// receiving view model 

// put this line in the constructor 
MessengerInstance.Register<Brush>(this, token, brush => ChangeColor(brush)); 

public void ChangeColor(Brush brush) 
{ 
    Brush = brush; 
} 

[EDIT] URL на комментарий devuxer в ниже изменен: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

+0

Это прекрасно! Я попытался найти документацию по этому вопросу, но не нашел ни одного. Знаете ли вы о какой-либо документации, которую я могу пропустить? Я не видел почти ничего для MVVM Light. – DanteTheEgregore

+0

Парень, который разработал MVVM Light, Лоран Бугнион, имеет тенденцию использовать свой блог для внедрения новых функций или обновлений функций. Вот конкретная запись в посланнике, которая может вам помочь: http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx – devuxer

+0

Я был на операции и не получил шанс начать реализацию этого до сегодняшнего дня. Я не вижу, где MessengerInstance требует токена. Я добавлю свою реализацию на главный пост. Я также разместил здесь еще один вопрос: http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore

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