ObservableRecipient

Тип ObservableRecipient является базовым классом для наблюдаемых объектов, которые также выступает в качестве получателей сообщений. Этот класс является расширением ObservableObject , которое также обеспечивает встроенную поддержку использования IMessenger типа.

API платформы:ObservableRecipient, ObservableObject, IMessenger, WeakReferenceMessengerIRecipient<TMessage>PropertyChangedMessage<T>

Принцип работы

Тип ObservableRecipient предназначен для использования в качестве базового типа для моделей представления, которые также используют возможности IMessenger, так как он обеспечивает их встроенную поддержку. В частности:

  • Предусмотрены как конструктор без параметров, так и конструктор, принимающий экземпляр IMessenger, для использования при внедрении зависимостей. Он также предоставляет Messenger свойство, которое можно использовать для отправки и получения сообщений в режиме просмотра. Если используется конструктор без параметров, WeakReferenceMessenger.Default экземпляр будет назначен свойству Messenger .
  • Предоставляется свойство IsActive для активации/деактивации модели представления. В этом контексте «активировать» означает, что данная модель представления помечается как используемая, так что, например, она начинает прослушивать зарегистрированные сообщения, выполнять другие операции инициализации и т. д. Существуют два связанных метода, OnActivated и OnDeactivated, которые вызываются при изменении значения свойства. По умолчанию OnDeactivated автоматически отменяет регистрацию текущего экземпляра для всех зарегистрированных сообщений. Для получения наилучших результатов и предотвращения утечки памяти рекомендуется использовать OnActivated для регистрации в сообщениях и для OnDeactivated выполнения операций очистки. Этот шаблон позволяет включить или отключить модель представления несколько раз, а безопасно собирать без риска утечки памяти при каждом отключении. По умолчанию OnActivated автоматически регистрирует все обработчики сообщений, определённые с помощью интерфейса IRecipient<TMessage>.
  • Он предоставляет метод Broadcast<T>(T, T, string), который отправляет сообщение PropertyChangedMessage<T> через экземпляр IMessenger, доступный через свойство Messenger. Это можно использовать для удобного уведомления об изменениях свойств ViewModel без необходимости вручную получать экземпляр Messenger для этого. Этот метод используется в перегруженных версиях различных методов SetProperty, которые имеют дополнительное свойство bool broadcast, указывающее, следует ли также отправлять сообщение.

Вот пример модели представления, которая получает сообщения LoggedInUserRequestMessage, когда активна:

public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
    public void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

В приведенном выше OnActivated примере автоматически регистрирует экземпляр в качестве получателя LoggedInUserRequestMessage сообщений, используя этот метод в качестве вызываемого действия. IRecipient<TMessage> Использование интерфейса не является обязательным, и регистрация также может выполняться вручную (даже с помощью встроенного лямбда-выражения):

public class MyViewModel : ObservableRecipient
{
    protected override void OnActivated()
    {
        // Using a method group...
        Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) => r.Receive(m));

        // ...or a lambda expression
        Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) =>
        {
            // Handle the message here
        });
    }

    private void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

Примеры

  • Ознакомьтесь с примером приложения (для нескольких платформ пользовательского интерфейса), чтобы просмотреть набор средств MVVM в действии.
  • Дополнительные примеры можно найти в модульных тестах.