ObservableRecipient

ObservableRecipient 型は、メッセージの受信者としても機能する監視可能なオブジェクトの基底クラスです。 このクラスは ObservableObject の拡張機能であり、IMessenger 型を使用するための組み込みサポートも提供します。

プラットフォーム API:ObservableRecipientObservableObjectIMessengerWeakReferenceMessengerIRecipient<TMessage>PropertyChangedMessage<T>

しくみ

ObservableRecipient 型は、IMessenger 機能も使用する ViewModel に組み込みのサポートを提供するため、それらの基底として使用することを目的としています。 特に次の点に違いがあります。

  • これには、パラメーターのないコンストラクターと、依存関係の挿入で使用される IMessenger インスタンスを受け取るコンストラクターの両方が含まれます。 また、ViewModel でメッセージを送受信するために使用できる Messenger プロパティも公開します。 パラメーターのないコンストラクターを使用する場合、WeakReferenceMessenger.Default インスタンスは Messenger プロパティに割り当てられます。
  • ViewModel をアクティブまたは非アクティブにするために IsActive プロパティが公開されます。 このコンテキストで、"アクティブにする" とは、特定の ViewModel を使用中としてマークすることを意味します。たとえば、ViewModel は、登録されたメッセージのリッスンを開始したり、他のセットアップ操作を実行したりします。関連する 2 つのメソッド (OnActivatedOnDeactivated) があります。これらは、プロパティの値が変更されたときに呼び出されます。 既定では、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
    }
}

  • MVVM Toolkit の実際の動作を確認するには、サンプル アプリ (複数の UI フレームワーク向け) を参照してください。
  • また、単体テストでは、その他の例を確認できます。