ObservableRecipient

Le type ObservableRecipient est une classe de base pour les objets observables qui jouent également le rôle de destinataires pour les messages. Cette classe est une extension de ObservableObject qui propose également une prise en charge intégrée pour l’utilisation du type IMessenger.

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

Fonctionnement

Le type ObservableRecipient est censé servir de base pour les viewmodels qui utilisent également les fonctionnalités IMessenger, car il propose pour cela une prise en charge intégrée. En particulier :

  • Il contient un constructeur sans paramètre et un autre qui accepte une instance IMessenger, à utiliser avec l’injection de dépendances. Il expose également une propriété Messenger qui permet d’envoyer et de recevoir des messages dans le viewmodel. Si le constructeur sans paramètre est utilisé, l’instance WeakReferenceMessenger.Default est affectée à la propriété Messenger.
  • Il expose une propriété IsActive pour activer/désactiver le viewmodel. Dans ce contexte, « activer » signifie qu’un viewmodel donné est marqué comme étant utilisé, c’est-à-dire qu’il commence à écouter les messages inscrits, qu’il effectue d’autres opérations de configuration, etc. Deux méthodes connexes, OnActivated et OnDeactivated, sont appelées lorsque la propriété change de valeur. Par défaut, OnDeactivated désinscrit automatiquement l’instance active de tous les messages inscrits. Pour de meilleurs résultats et pour éviter des fuites de mémoire, il est recommandé d’utiliser OnActivated pour s’inscrire aux messages et d’utiliser OnDeactivated pour effectuer des opérations de nettoyage. Ce modèle permet à un viewmodel d’être activé/désactivé plusieurs fois. De plus, il peut être collecté sans risque de fuites de mémoire chaque fois qu’il est désactivé. Par défaut, OnActivated inscrit automatiquement tous les gestionnaires de messages définis via l’interface IRecipient<TMessage>.
  • Il expose une méthode Broadcast<T>(T, T, string) qui envoie un message PropertyChangedMessage<T> via l’instance IMessenger disponible à partir de la propriété Messenger. Elle permet de diffuser facilement les modifications intervenues dans les propriétés d’un viewmodel sans avoir à récupérer manuellement une instance Messenger à utiliser. Cette méthode est employée par la surcharge des diverses méthodes SetProperty, qui disposent d’une propriété bool broadcast supplémentaire pour indiquer s’il convient ou non d’envoyer également un message.

Voici un exemple de viewmodel qui reçoit des messages LoggedInUserRequestMessage lorsqu’il est actif :

public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
    public void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

Dans l’exemple ci-dessus, OnActivated inscrit automatiquement l’instance en tant que destinataire des messages LoggedInUserRequestMessage, utilisant cette méthode comme action à appeler. L’utilisation de l’interface IRecipient<TMessage> n’est pas obligatoire, et l’inscription peut aussi se faire manuellement (même en utilisant simplement une expression lambda incluse) :

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
    }
}

Exemples

  • Consultez l’exemple d’application (pour plusieurs infrastructures d’interface utilisateur) pour voir le kit d’outils MVVM à l’œuvre.
  • Vous trouverez également d’autres exemples dans les tests unitaires.