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 propriedadeMessenger
que pode ser usada para enviar e receber mensagens no viewmodel. Se o construtor sem parâmetros for usado, a instância deWeakReferenceMessenger.Default
será atribuída à propriedadeMessenger
. - 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
eOnDeactivated
, 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 usarOnActivated
para o registro em mensagens eOnDeactivated
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 interfaceIRecipient<TMessage>
. - Ele expõe um método
Broadcast<T>(T, T, string)
que envia uma mensagemPropertyChangedMessage<T>
por meio da instância deIMessenger
disponível por meio da propriedadeMessenger
. 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 deMessenger
para usá-la. Esse método é usado pela sobrecarga dos vários métodosSetProperty
, que têm uma propriedadebool 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
- Confira o aplicativo de exemplo (para várias estruturas de interface do usuário) para ver o Kit de Ferramentas do MVVM em ação.
- Encontre também mais exemplos nos testes de unidade.