Compartir a través de


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 propiedad Messenger que se puede usar para enviar y recibir mensajes en el modelo de vista. Si se usa el constructor sin parámetros, la instancia WeakReferenceMessenger.Default se asignará a la propiedad Messenger.
  • 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 y OnDeactivated, 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 usar OnActivated para registrarse en los mensajes y usar OnDeactivated 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 interfaz IRecipient<TMessage>.
  • Expone un método Broadcast<T>(T, T, string) que envía un mensaje PropertyChangedMessage<T> a través de la instanciaIMessenger disponible desde la propiedad Messenger. Esto se puede usar para difundir fácilmente los cambios en las propiedades de un modelo de vista sin tener que recuperar manualmente una instancia Messenger que se va a usar. La sobrecarga de los distintos métodos SetProperty usa este método, que tiene una propiedad adicional bool 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.