ObservableRecipient
El tipo ObservableRecipient
es una clase base para objetos observables que también actúa como destinatarios para los mensajes. Esta clase es una extensión de ObservableObject
, que también proporciona compatibilidad integrada para usar el tipo IMessenger
.
API de la plataforma:
ObservableRecipient
,ObservableObject
,IMessenger
,WeakReferenceMessenger
,IRecipient<TMessage>
,PropertyChangedMessage<T>
Funcionamiento
El tipo ObservableRecipient
está diseñado para usarse como base para los modelos de vista que también usan las características IMessenger
, ya que proporciona compatibilidad integrada para él. En concreto:
- Tiene un constructor sin parámetros y otro que toma una instancia
IMessenger
, que se usará con la inserción de dependencias. También expone una propiedadMessenger
que se puede usar para enviar y recibir mensajes en el modelo de vista. Si se usa el constructor sin parámetros, la instanciaWeakReferenceMessenger.Default
se asignará a la propiedadMessenger
. - Expone una propiedad
IsActive
para activar o desactivar el modelo de vista. En este contexto, "activar" significa que un modelo de vista determinado está marcado como en uso, por ejemplo, comenzará a escuchar mensajes registrados, realizar otras operaciones de configuración, etc. Hay dos métodos relacionados,OnActivated
yOnDeactivated
, que se invocan cuando cambia el valor de la propiedad. De forma predeterminada,OnDeactivated
anula automáticamente el registro de la instancia actual de todos los mensajes registrados. Para obtener los mejores resultados y evitar pérdidas de memoria, se recomienda usarOnActivated
para registrarse en los mensajes y usarOnDeactivated
para realizar operaciones de limpieza. Este patrón permite que un modelo de vista se habilite o deshabilite varias veces, mientras que es seguro recopilarlo sin el riesgo de pérdidas de memoria cada vez que se desactiva. De forma predeterminada,OnActivated
registrará automáticamente todos los controladores de mensajes definidos a través de la interfazIRecipient<TMessage>
. - Expone un método
Broadcast<T>(T, T, string)
que envía un mensajePropertyChangedMessage<T>
a través de la instanciaIMessenger
disponible desde la propiedadMessenger
. Esto se puede usar para difundir fácilmente los cambios en las propiedades de un modelo de vista sin tener que recuperar manualmente una instanciaMessenger
que se va a usar. La sobrecarga de los distintos métodosSetProperty
usa este método, que tiene una propiedad adicionalbool broadcast
para indicar si también se va a enviar un mensaje.
Este es un ejemplo de un modelo de vista que recibe mensajes LoggedInUserRequestMessage
cuando está activo:
public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
public void Receive(LoggedInUserRequestMessage message)
{
// Handle the message here
}
}
En el ejemplo anterior, OnActivated
registra automáticamente la instancia como un destinatario para los mensajes LoggedInUserRequestMessage
, utilizando ese método como la acción que se va a invocar. El uso de la interfaz IRecipient<TMessage>
no es obligatorio y el registro también se puede realizar manualmente (incluso usando solo una expresión lambda insertada):
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
}
}
Ejemplos
- Consulte la aplicación de ejemplo (para varios marcos de interfaz de usuario) para ver el kit de herramientas de MVVM en acción.
- También puede encontrar más ejemplos en las pruebas unitarias.