ObservableRecipient型は、メッセージの受信者としても機能する監視可能なオブジェクトの基本クラスです。 このクラスは ObservableObject の拡張機能であり、 IMessenger 型を使用するための組み込みのサポートも提供します。
プラットフォーム API:
ObservableRecipient、ObservableObject、IMessenger、WeakReferenceMessenger、IRecipient<TMessage>、PropertyChangedMessage<T>
どのように機能するのか
ObservableRecipient型は、組み込みのサポートを提供するため、IMessenger機能も使用するビューモデルのベースとして使用されます。 具体的には次のとおりです。
- パラメーターなしのコンストラクターと、依存関係の挿入で使用される
IMessengerインスタンスを受け取るコンストラクターの両方があります。 また、ビューモデルでメッセージを送受信するために使用できるMessengerプロパティも公開します。 パラメーターなしのコンストラクターを使用すると、WeakReferenceMessenger.DefaultインスタンスがMessengerプロパティに割り当てられます。 - ビューモデルをアクティブ化または非アクティブ化するために、
IsActiveプロパティを公開します。 このコンテキストでは、"アクティブ化" とは、特定のビューモデルが使用中としてマークされていることを意味します。たとえば、登録されたメッセージのリッスン、その他のセットアップ操作の実行などを開始します。プロパティの値が変更されたときに呼び出される、OnActivatedとOnDeactivatedの 2 つの関連メソッドがあります。 既定では、OnDeactivatedは、登録されているすべてのメッセージから現在のインスタンスの登録を自動的に解除します。 最適な結果を得るために、メモリ リークを回避するには、OnActivatedを使用してメッセージに登録し、OnDeactivatedを使用してクリーンアップ操作を行うことをお勧めします。 このパターンを使用すると、ビューモデルを複数回有効または無効にすることができますが、非アクティブ化されるたびにメモリ リークのリスクなしに安全に収集できます。 既定では、OnActivatedは、IRecipient<TMessage>インターフェイスを介して定義されたすべてのメッセージ ハンドラーを自動的に登録します。 -
Broadcast<T>(T, T, string)プロパティから使用可能なPropertyChangedMessage<T>インスタンスを介してIMessengerメッセージを送信するMessengerメソッドを公開します。 これを使用すると、使用するMessengerインスタンスを手動で取得しなくても、ビューモデルのプロパティの変更を簡単にブロードキャストできます。 このメソッドは、さまざまなSetPropertyメソッドのオーバーロードによって使用されます。このメソッドには、メッセージも送信するかどうかを示す追加のbool broadcastプロパティがあります。
アクティブな場合に LoggedInUserRequestMessage メッセージを受信するビューモデルの例を次に示します。
public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
public void Receive(LoggedInUserRequestMessage message)
{
// Handle the message here
}
}
上記の例では、 OnActivated は、そのメソッドを呼び出すアクションとして使用して、 LoggedInUserRequestMessage メッセージの受信者としてインスタンスを自動的に登録します。
IRecipient<TMessage> インターフェイスの使用は必須ではなく、登録を手動で行うこともできます (インラインラムダ式を使用する場合でも)。
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
}
}
例示
MVVM Toolkit