ObservableRecipient

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

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

どのように機能するのか

ObservableRecipient型は、組み込みのサポートを提供するため、IMessenger機能も使用するビューモデルのベースとして使用されます。 具体的には次のとおりです。

  • パラメーターなしのコンストラクターと、依存関係の挿入で使用される IMessenger インスタンスを受け取るコンストラクターの両方があります。 また、ビューモデルでメッセージを送受信するために使用できる Messenger プロパティも公開します。 パラメーターなしのコンストラクターを使用すると、 WeakReferenceMessenger.Default インスタンスが Messenger プロパティに割り当てられます。
  • ビューモデルをアクティブ化または非アクティブ化するために、 IsActive プロパティを公開します。 このコンテキストでは、"アクティブ化" とは、特定のビューモデルが使用中としてマークされていることを意味します。たとえば、登録されたメッセージのリッスン、その他のセットアップ操作の実行などを開始します。プロパティの値が変更されたときに呼び出される、 OnActivatedOnDeactivatedの 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 の動作を確認するには、 サンプル アプリ (複数の UI フレームワークの場合) を確認してください。
  • 単体テストでさらに例を見つけることもできます。