Используйте мессенджер MVVM Light для передачи значений между моделью вида
MVVM передают значения между моделями вида пытаюсь понять. Документация на MVVM Light не так велика на данный момент, поэтому я совершенно не уверен, куда идти.
скажем, у меня есть две ViewModels и ViewModelLocator. Я хочу иметь возможность передавать параметры между всеми тремя без проблем. Как бы я поступил с посыльным? Это способен на это?
Edit: вот моя новая реализация. На данный момент похоже, что MessengerInstance не требует токена. Я в замешательстве.
в первом ViewModel:
MessengerInstance.Send<XDocument>(SelectedDocument);
и второе:
MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc));
может быть совершенно неправильно. У меня не было возможности проверить это, но visual studio меньше злится на меня, когда я делаю это таким образом. Также MessengerInstance регистрируется до отправки сообщения.
1 ответов
скажем, у меня есть две 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 to комментарий devuxer ниже изменен на: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/