ObservableRecipient
ObservableRecipient
型は、メッセージの受信者としても機能する監視可能なオブジェクトの基底クラスです。 このクラスは ObservableObject
の拡張機能であり、IMessenger
型を使用するための組み込みサポートも提供します。
プラットフォーム API:
ObservableRecipient
、ObservableObject
、IMessenger
、WeakReferenceMessenger
、IRecipient<TMessage>
、PropertyChangedMessage<T>
しくみ
ObservableRecipient
型は、IMessenger
機能も使用する ViewModel に組み込みのサポートを提供するため、それらの基底として使用することを目的としています。 特に次の点に違いがあります。
- これには、パラメーターのないコンストラクターと、依存関係の挿入で使用される
IMessenger
インスタンスを受け取るコンストラクターの両方が含まれます。 また、ViewModel でメッセージを送受信するために使用できるMessenger
プロパティも公開します。 パラメーターのないコンストラクターを使用する場合、WeakReferenceMessenger.Default
インスタンスはMessenger
プロパティに割り当てられます。 - ViewModel をアクティブまたは非アクティブにするために
IsActive
プロパティが公開されます。 このコンテキストで、"アクティブにする" とは、特定の ViewModel を使用中としてマークすることを意味します。たとえば、ViewModel は、登録されたメッセージのリッスンを開始したり、他のセットアップ操作を実行したりします。関連する 2 つのメソッド (OnActivated
とOnDeactivated
) があります。これらは、プロパティの値が変更されたときに呼び出されます。 既定では、OnDeactivated
は、登録されているすべてのメッセージから現在のインスタンスの登録を自動的に解除します。 最適な結果を得て、メモリ リークを回避するために、OnActivated
を使用してメッセージに登録し、OnDeactivated
を使用してクリーンアップ操作を行うことをお勧めします。 このパターンを使用すると、ViewModel を複数回有効または無効にすることができ、ViewModel が非アクティブになるたびにメモリ リークのリスクを冒すことなく安全に収集できます。 既定では、OnActivated
は、IRecipient<TMessage>
インターフェイスを介して定義されたすべてのメッセージ ハンドラーを自動的に登録します。 - これは、
Messenger
プロパティから使用可能なIMessenger
インスタンスを介してPropertyChangedMessage<T>
メッセージを送信するBroadcast<T>(T, T, string)
メソッドを公開します。 これを使用すると、使用するMessenger
インスタンスを手動で取得する必要なく、ViewModel のプロパティの変更を簡単にブロードキャストできます。 このメソッドは、さまざまなSetProperty
メソッドのオーバーロードによって使用されます。このメソッドには、メッセージを送信するかどうかも示す追加のbool broadcast
プロパティがあります。
アクティブな場合に LoggedInUserRequestMessage
メッセージを受信する ViewModel の例を次に示します。
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
}
}
例
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
MVVM Toolkit