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’instanceWeakReferenceMessenger.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
etOnDeactivated
, 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’utiliserOnActivated
pour s’inscrire aux messages et d’utiliserOnDeactivated
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’interfaceIRecipient<TMessage>
. - Il expose une méthode
Broadcast<T>(T, T, string)
qui envoie un messagePropertyChangedMessage<T>
via l’instanceIMessenger
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 instanceMessenger
à utiliser. Cette méthode est employée par la surcharge des diverses méthodesSetProperty
, 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.