Используйте мессенджер 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/