ObservableRecipient

Der ObservableRecipient Typ ist eine Basisklasse für feststellbare Objekte, die auch als Empfänger für Nachrichten fungieren. Diese Klasse ist eine Erweiterung von ObservableObject und bietet außerdem integrierte Unterstützung für die Verwendung des Typs IMessenger.

Plattform-APIs:ObservableRecipient, , ObservableObject, IMessenger, WeakReferenceMessengerIRecipient<TMessage>PropertyChangedMessage<T>

So funktioniert es

Der ObservableRecipient Typ soll als Basis für Viewmodels verwendet werden, die auch die IMessenger Features verwenden, da er integrierte Unterstützung dafür bietet. Dies gilt insbesondere für:

  • Sie verfügt sowohl über einen parameterlosen Konstruktor als auch über einen Konstruktor, der eine IMessenger Instanz verwendet, die mit Abhängigkeitsinjektion verwendet werden soll. Außerdem wird eine Messenger Eigenschaft verfügbar gemacht, die zum Senden und Empfangen von Nachrichten im Ansichtsmodell verwendet werden kann. Wenn der parameterlose Konstruktor verwendet wird, wird die WeakReferenceMessenger.Default Instanz der Messenger Eigenschaft zugewiesen.
  • Sie macht eine IsActive Eigenschaft verfügbar, um das Ansichtsmodell zu aktivieren/zu deaktivieren. In diesem Kontext bedeutet die Aktivierung, dass ein bestimmtes Ansichtsmodell als verwendet markiert wird, z. B. Sie beginnt mit der Überwachung registrierter Nachrichten, führt andere Setupvorgänge usw. durch. Es gibt zwei verwandte Methoden OnActivated und OnDeactivated, die aufgerufen werden, wenn der Eigenschaftswert geändert wird. Standardmäßig meldet OnDeactivated die aktuelle Instanz automatisch von allen registrierten Nachrichten ab. Um optimale Ergebnisse zu erzielen und Speicherlecks zu vermeiden, wird empfohlen, OnActivated zu verwenden, um sich für Nachrichten zu registrieren, und OnDeactivated zu verwenden, um Aufräumarbeiten durchzuführen. Mit diesem Muster kann ein Ansichtsmodell mehrmals aktiviert/deaktiviert werden, ohne dass das Risiko von Speicherverlusten bei jeder Deaktivierung besteht. OnActivated Standardmäßig werden alle über die IRecipient<TMessage> Schnittstelle definierten Nachrichtenhandler automatisch registriert.
  • Sie stellt eine Broadcast<T>(T, T, string)-Methode bereit, die eine PropertyChangedMessage<T>-Nachricht über die in der Messenger-Eigenschaft verfügbare IMessenger-Instanz sendet. Dies kann verwendet werden, um Änderungen an den Eigenschaften eines Ansichtsmodells einfach zu übertragen, ohne eine Messenger instanz für die Verwendung manuell abrufen zu müssen. Diese Methode wird von den Überladungen verschiedener SetProperty-Methoden verwendet, die eine zusätzliche Eigenschaft bool broadcast aufweisen, um anzugeben, ob zusätzlich eine Nachricht gesendet werden soll.

Hier ist ein Beispiel für ein ViewModel, das LoggedInUserRequestMessage Nachrichten empfängt, wenn es aktiv ist:

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

Im obigen OnActivated Beispiel wird die Instanz automatisch als Empfänger für LoggedInUserRequestMessage Nachrichten registriert, wobei diese Methode als aufrufende Aktion verwendet wird. Die Verwendung der IRecipient<TMessage> Schnittstelle ist nicht obligatorisch, und die Registrierung kann auch manuell durchgeführt werden (auch mit nur einem Inline-Lambda-Ausdruck):

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

Beispiele

  • Sehen Sie sich die Beispiel-App (für mehrere UI-Frameworks) an, um das MVVM-Toolkit in Aktion zu sehen.
  • Weitere Beispiele finden Sie auch in den Komponententests.