Freigeben über


ObservableRecipient

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

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

Funktionsweise

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

  • Er verfügt sowohl über einen parameterlosen Konstruktor als auch über einen Konstruktor, der eine IMessenger-Instanz akzeptiert und mit Abhängigkeitsinjektion verwendet werden soll. Außerdem wird die Eigenschaft Messenger 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 Eigenschaft Messenger zugewiesen.
  • Sie macht die Eigenschaft IsActive zum Aktivieren/Deaktivieren des Ansichtsmodells verfügbar. In diesem Kontext bedeutet die Aktivierung, dass ein bestimmtes Ansichtsmodell als in Gebrauch markiert wird, so dass es z. B. beginnt, auf registrierte Nachrichten zu warten, andere Setupvorgänge auszuführen usw. Es gibt die beiden verwandte Methoden OnActivated und OnDeactivated, die aufgerufen werden, wenn sich der Eigenschaftswert ändert. Standardmäßig hebt OnDeactivated die Registrierung der aktuellen Instanz automatisch für alle registrierten Nachrichten auf. Um optimale Ergebnisse zu erzielen und Speicherverluste zu vermeiden, wird empfohlen, OnActivated für die Registrierung für Nachrichten und OnDeactivated für Bereinigungsvorgänge zu verwenden. Mit diesem Muster kann ein Ansichtsmodell mehrmals aktiviert/deaktiviert werden, ohne dass bei jeder Deaktivierung das Risiko von Speicherverlusten besteht. Standardmäßig registriert OnActivated automatisch alle über die Schnittstelle IRecipient<TMessage> definierten Nachrichtenhandler.
  • Sie macht die Methode Broadcast<T>(T, T, string) verfügbar, die eine PropertyChangedMessage<T>-Nachricht über die IMessenger-Instanz sendet, die von der Eigenschaft Messenger verfügbar gemacht wird. Dies kann verwendet werden, um Änderungen an den Eigenschaften eines Ansichtsmodells einfach zu übertragen, ohne dass eine Messenger-Instanz manuell abgerufen werden muss. Diese Methode wird von der Überladung der verschiedenen SetProperty-Methoden verwendet, die über eine zusätzliche bool broadcast-Eigenschaft verfügen, die angibt, ob auch eine Nachricht gesendet werden soll oder nicht.

Hier ist ein Beispiel für ein Ansichtsmodell, 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 Beispiel registriert OnActivated die Instanz automatisch als Empfänger von LoggedInUserRequestMessage-Nachrichten, wobei diese Methode als aufrufende Aktion verwendet wird. Die Verwendung der Schnittstelle IRecipient<TMessage> ist nicht obligatorisch, und die Registrierung kann auch manuell durchgeführt werden (selbst mit nur einem Inline-Lambdaausdruck):

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 Benutzeroberflächen-Frameworks) an, um das MVVM-Toolkit in Aktion zu sehen.
  • Weitere Beispiele finden Sie auch in den Komponententests.