ObservableRecipient
此 ObservableRecipient
類型是可觀察物件的基類,也可以做為郵件收件者。 此類別是 的延伸模組 ObservableObject
,其也提供內建支援來使用 型別 IMessenger
。
平臺 API:
ObservableRecipient
、、、WeakReferenceMessenger
IMessenger
ObservableObject
、、IRecipient<TMessage>
PropertyChangedMessage<T>
運作方式
此 ObservableRecipient
類型旨在做為也使用 IMessenger
功能的 viewmodel 基底,因為它提供內建支援。 特別是:
- 它同時具有無參數建構函式,以及接受
IMessenger
實例的建構函式,以搭配相依性插入使用。 它也會公開Messenger
屬性,可用來在 viewmodel 中傳送和接收訊息。 如果使用無參數建構函式,則會WeakReferenceMessenger.Default
將實例指派給Messenger
屬性。 - 它會公開
IsActive
屬性以啟動/停用 viewmodel。 在此內容中,若要「啟動」,表示指定的 viewmodel 標示為正在使用中,例如。它會開始接聽已註冊的訊息、執行其他設定作業等等。屬性變更值時,會叫用兩個相關的方法和OnActivated
OnDeactivated
。 根據預設,OnDeactivated
會自動從所有已註冊的訊息取消註冊目前的實例。 為了獲得最佳結果並避免記憶體流失,建議您使用OnActivated
來註冊訊息,以及用來OnDeactivated
執行清除作業。 此模式可讓 viewmodel 啟用/停用多次,同時安全地收集,而不會每次停用記憶體流失的風險。 根據預設,OnActivated
會自動註冊透過IRecipient<TMessage>
介面定義的所有訊息處理程式。 - 它會公開
Broadcast<T>(T, T, string)
方法,這個方法會透過 可從 屬性取得的IMessenger
Messenger
實例傳送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
使用該方法作為要叫用的動作,自動將 實例註冊為郵件收件者 LoggedInUserRequestMessage
。 IRecipient<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
}
}