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 EigenschaftMessenger
verfügbar gemacht, die zum Senden und Empfangen von Nachrichten im Ansichtsmodell verwendet werden kann. Wenn der parameterlose Konstruktor verwendet wird, wird dieWeakReferenceMessenger.Default
-Instanz der EigenschaftMessenger
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 MethodenOnActivated
undOnDeactivated
, die aufgerufen werden, wenn sich der Eigenschaftswert ändert. Standardmäßig hebtOnDeactivated
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 undOnDeactivated
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 registriertOnActivated
automatisch alle über die SchnittstelleIRecipient<TMessage>
definierten Nachrichtenhandler. - Sie macht die Methode
Broadcast<T>(T, T, string)
verfügbar, die einePropertyChangedMessage<T>
-Nachricht über dieIMessenger
-Instanz sendet, die von der EigenschaftMessenger
verfügbar gemacht wird. Dies kann verwendet werden, um Änderungen an den Eigenschaften eines Ansichtsmodells einfach zu übertragen, ohne dass eineMessenger
-Instanz manuell abgerufen werden muss. Diese Methode wird von der Überladung der verschiedenenSetProperty
-Methoden verwendet, die über eine zusätzlichebool 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.