共用方式為


ObservableRecipient

ObservableRecipient 類型是可觀察物件的基類,也可以做為郵件收件者。 此類別是 的延伸模組 ObservableObject ,其也提供內建支援來使用 型別 IMessenger

平臺 API:ObservableRecipient、、、WeakReferenceMessengerIMessengerObservableObject、、 IRecipient<TMessage>PropertyChangedMessage<T>

運作方式

ObservableRecipient 類型旨在做為也使用 IMessenger 功能的 viewmodel 基底,因為它提供內建支援。 特別是:

  • 它同時具有無參數建構函式,以及接受 IMessenger 實例的建構函式,以搭配相依性插入使用。 它也會公開 Messenger 屬性,可用來在 viewmodel 中傳送和接收訊息。 如果使用無參數建構函式,則會 WeakReferenceMessenger.Default 將實例指派給 Messenger 屬性。
  • 它會公開 IsActive 屬性以啟動/停用 viewmodel。 在此內容中,若要「啟動」,表示指定的 viewmodel 標示為正在使用中,例如。它會開始接聽已註冊的訊息、執行其他設定作業等等。屬性變更值時,會叫用兩個相關的方法和 OnActivatedOnDeactivated。 根據預設, OnDeactivated 會自動從所有已註冊的訊息取消註冊目前的實例。 為了獲得最佳結果並避免記憶體流失,建議您使用 OnActivated 來註冊訊息,以及用來 OnDeactivated 執行清除作業。 此模式可讓 viewmodel 啟用/停用多次,同時安全地收集,而不會每次停用記憶體流失的風險。 根據預設, OnActivated 會自動註冊透過 IRecipient<TMessage> 介面定義的所有訊息處理程式。
  • 它會公開Broadcast<T>(T, T, string)方法,這個方法會透過 可從 屬性取得的IMessengerMessenger實例傳送PropertyChangedMessage<T>訊息。 這可以用來輕鬆地廣播 ViewModel 屬性中的變更,而不需要手動擷取 Messenger 要使用的實例。 這個方法是由各種 SetProperty 方法的多載所使用,這些方法具有額外的 bool broadcast 屬性來指出是否也傳送訊息。

以下是在作用中時接收 LoggedInUserRequestMessage 訊息的 ViewModel 範例:

public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
    public void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

在上述範例中, OnActivated 使用該方法作為要叫用的動作,自動將 實例註冊為郵件收件者 LoggedInUserRequestMessageIRecipient<TMessage>使用 介面並非必要,而且註冊也可以手動完成(即使只使用內嵌 Lambda 表達式):

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
    }
}

範例

  • 查看 範例應用程式 (適用於多個 UI 架構),以查看 MVVM 工具組的運作情形。
  • 您也可以在單元測試中找到更多範例。