ObservableRecipient

O ObservableRecipient tipo é uma classe base para objetos observáveis que também atuam como destinatários de mensagens. Essa classe é uma extensão da ObservableObject qual também fornece suporte interno para usar o IMessenger tipo.

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

Como funciona

O tipo ObservableRecipient deve ser usado como base para modelos de exibição que também usam os recursos de IMessenger, pois fornece suporte integrado para eles. Em particular:

  • Ele tem um construtor sem parâmetros e um que usa uma IMessenger instância para ser usado com injeção de dependência. Ele também expõe uma Messenger propriedade que pode ser usada para enviar e receber mensagens no viewmodel. Se o construtor sem parâmetros for usado, a WeakReferenceMessenger.Default instância será atribuída à Messenger propriedade.
  • Ele disponibiliza a propriedade IsActive para ativar ou desativar o modelo de exibição. Nesse contexto, "ativar" significa que um determinado viewmodel é marcado como estando em uso, de modo que, por exemplo, ele passará a escutar mensagens registradas, executar outras operações de configuração etc. Há dois métodos relacionados, OnActivated e OnDeactivated, que são invocados quando o valor da propriedade muda. Por padrão, OnDeactivated cancela automaticamente o registro da instância atual de todas as mensagens registradas. Para obter melhores resultados e evitar vazamentos de memória, é recomendável usar OnActivated o registro em mensagens e usar OnDeactivated para fazer operações de limpeza. Esse padrão permite que um ViewModel seja habilitado e desabilitado várias vezes, podendo ser coletado com segurança sem o risco de vazamentos de memória cada vez que ele é desativado. Por padrão, OnActivated registrará automaticamente todos os manipuladores de mensagens definidos por meio da IRecipient<TMessage> interface.
  • Ele expõe um método Broadcast<T>(T, T, string) que envia uma mensagem PropertyChangedMessage<T> por meio da instância IMessenger disponível na propriedade Messenger. Isso pode ser usado para propagar facilmente alterações de propriedades de um viewmodel sem precisar recuperar manualmente uma instância de Messenger para usar. Esse método é usado pela sobrecarga dos vários SetProperty métodos, que têm uma propriedade adicional bool broadcast para indicar se também deve ou não enviar uma mensagem.

Aqui está um exemplo de um viewmodel que recebe LoggedInUserRequestMessage mensagens 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 LoggedInUserRequestMessage mensagens, usando esse método como a ação a ser invocada. O uso da IRecipient<TMessage> interface não é obrigatório e o registro também pode ser feito manualmente (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

  • Confira o aplicativo de exemplo (para várias estruturas de interface do usuário) para ver o Kit de Ferramentas MVVM em ação.
  • Você também pode encontrar mais exemplos nos testes de unidade.