ObservableRecipient

El ObservableRecipient tipo 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 la que también proporciona compatibilidad integrada para usar el IMessenger tipo .

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

Cómo funciona

El ObservableRecipient tipo está diseñado para usarse como base para los modelos de vista que también usan las IMessenger características, ya que proporciona compatibilidad integrada para él. En particular:

  • Tiene tanto un constructor sin parámetros como otro que acepta una instancia de IMessenger, para su uso con la inyección de dependencias. También expone una Messenger propiedad que se puede usar para enviar y recibir mensajes en el modelo de vista. Si se usa el constructor sin parámetros, la WeakReferenceMessenger.Default instancia se asignará a la Messenger propiedad .
  • Expone una IsActive propiedad para activar o desactivar el modelo de vista. En este contexto, para "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 y deshabilite varias veces, y que pueda ser recolectado de forma segura sin riesgo de fugas de memoria cada vez que se desactive. De forma predeterminada, OnActivated registrará automáticamente todos los controladores de mensajes definidos a través de la IRecipient<TMessage> interfaz .
  • Expone un Broadcast<T>(T, T, string) método que envía un PropertyChangedMessage<T> mensaje a través de la IMessenger instancia disponible desde la Messenger propiedad . Esto se puede usar para difundir fácilmente los cambios en las propiedades de un modelo de vista sin tener que recuperar manualmente una Messenger instancia que se va a usar. Este método es utilizado por las distintas sobrecargas de los métodos SetProperty, que tienen una propiedad adicional bool broadcast para indicar si se debe enviar también un mensaje o no.

Este es un ejemplo de un modelo de vista que recibe LoggedInUserRequestMessage mensajes 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 LoggedInUserRequestMessage los mensajes, utilizando ese método como la acción que se va a invocar. El uso de la IRecipient<TMessage> interfaz 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.