Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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éMessengerqui permet d’envoyer et de recevoir des messages dans le viewmodel. Si le constructeur sans paramètre est utilisé, l’instanceWeakReferenceMessenger.Defaultest affectée à la propriétéMessenger. - Il expose une propriété
IsActivepour 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,OnActivatedetOnDeactivated, sont appelées lorsque la propriété change de valeur. Par défaut,OnDeactivateddé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’utiliserOnActivatedpour s’inscrire aux messages et d’utiliserOnDeactivatedpour 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,OnActivatedinscrit automatiquement tous les gestionnaires de messages définis via l’interfaceIRecipient<TMessage>. - Il expose une méthode
Broadcast<T>(T, T, string)qui envoie un messagePropertyChangedMessage<T>via l’instanceIMessengerdisponible à 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 instanceMessengerà utiliser. Cette méthode est employée par la surcharge des diverses méthodesSetProperty, qui disposent d’une propriétébool broadcastsupplé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.