Compartilhar via


ObservableRecipient

O tipo ObservableRecipient é uma classe base para objetos observáveis que também funcionam como destinatários de mensagens. Essa classe é uma extensão de ObservableObject, que também fornece suporte interno para o uso do tipo IMessenger.

APIs de plataforma:ObservableRecipient, ObservableObject, IMessenger, WeakReferenceMessenger, IRecipient<TMessage>, PropertyChangedMessage<T>

Como ele funciona

O tipo ObservableRecipient deve ser usado como base para viewmodels que também usam os recursos de IMessenger, pois ele fornece suporte interno a ele. Especialmente:

  • Ele tem um construtor sem parâmetros e outro que usa uma instância de IMessenger, a ser usada com a injeção de dependência. Também expõe uma propriedade Messenger que pode ser usada para enviar e receber mensagens no viewmodel. Se o construtor sem parâmetros for usado, a instância de WeakReferenceMessenger.Default será atribuída à propriedade Messenger.
  • Ele expõe uma propriedade IsActive para ativar/desativar o viewmodel. Nesse contexto, “ativar” significa que um determinado viewmodel está marcado como estando em uso, por exemplo, ele começará a escutar as mensagens registradas, executar outras operações de instalação etc. Há dois métodos relacionados, OnActivated e OnDeactivated, que são invocados quando a propriedade altera o valor. Por padrão, OnDeactivated cancela automaticamente o registro da instância atual de todas as mensagens registradas. Para obter melhores resultados e evitar perdas de memória, recomendamos usar OnActivated para o registro em mensagens e OnDeactivated para fazer operações de limpeza. Esse padrão permite que um viewmodel seja habilitado/desabilitado várias vezes, sendo seguro para coleta, sem o risco de perda de memória sempre que ele é desativado. Por padrão, OnActivated registrará automaticamente todos os manipuladores de mensagens definidos por meio da interface IRecipient<TMessage>.
  • Ele expõe um método Broadcast<T>(T, T, string) que envia uma mensagem PropertyChangedMessage<T> por meio da instância de IMessenger disponível por meio da propriedade Messenger. Isso pode ser usado para transmitir com facilidade as alterações nas propriedades de um viewmodel sem a necessidade de recuperar manualmente uma instância de Messenger para usá-la. Esse método é usado pela sobrecarga dos vários métodos SetProperty, que têm uma propriedade bool broadcast adicional para indicar se uma mensagem também deve ser enviada.

Veja um exemplo de um viewmodel que recebe mensagens LoggedInUserRequestMessage quando ativo:

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

No exemplo acima, OnActivated registra automaticamente a instância como um destinatário de mensagens LoggedInUserRequestMessage, usando esse método como a ação a ser invocada. O uso da interface IRecipient<TMessage> não é obrigatório e o registro também pode ser feito manualmente (até mesmo usando apenas uma expressão lambda embutida):

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
    }
}

Exemplos