一、ObservableRecipient
1.1. 定義
所處的位置,
命名控件:Microsoft.Toolkit.Mvvm.ComponentModel
程序集:Microsoft.Toolkit.Mvvm.dll
包:Microsoft.Toolkit.Mvvm
ObservableRecipient類型是可監(jiān)視對象(Observable objects)的一個(gè)基類,這些對象扮演著消息接收者的角色。ObservableRecipient類是ObservableObject的拓展,它也提供了使用IMessenger類型的內(nèi)置支持。
繼承關(guān)系:
Object→ObservableObject→ObservableRecipient
相關(guān)的平臺API:
- ObservableRecipient
- ObservableObject
- IMessenger
- WeakReferenceMessenger
- IRecipient<TMessage>
- PropertyChangedMessage<T>
1.2. 它是如何工作的
ObservableRecipient設(shè)計(jì)出來是用來作為viewmodel的基礎(chǔ)(或者說基對象)的,它也使用了IMessenger的特性,因?yàn)樗鼮镮Messenger提供了內(nèi)置支持。特別地:
- 它有一個(gè)無參的構(gòu)造函數(shù)和一個(gè)接受IMessenger實(shí)例的構(gòu)造函數(shù),被用作依賴注入。
它還暴露了一個(gè)Messenger屬性,可用來在viewmodel中收發(fā)消息。如果使用了無參構(gòu)造函數(shù),WeakReferenceMessenger.Default實(shí)例將會被分配給Messenger屬性。 - 它暴露了IsActive屬性以激活(Activate)/禁用(Deactivate)viewmodel。在這種情況下,激活意味著viewmodel被標(biāo)記為正在使用,例如,它將開始監(jiān)聽已注冊的消息,執(zhí)行其他的設(shè)置操作等。有兩個(gè)相關(guān)的方法OnActivated 和 OnDeactivated,在屬性改變值時(shí),它們會被調(diào)用。默認(rèn)情況下,OnDeactivated會自動(dòng)從所有已注冊的消息中注銷當(dāng)前實(shí)例。為了獲得最佳效果和避免內(nèi)存泄漏,建議使用OnActivate來注冊消息,使用OnDeactivate來做清理操作。這種模式允許viewmodel啟停多次,同時(shí)可以安全地收集,而不會在每次停用的時(shí)候產(chǎn)生內(nèi)存泄漏的風(fēng)險(xiǎn)。默認(rèn)情況下,OnActivate會自動(dòng)注冊所有通過IRecipient<TMessage>接口定義的消息處理器。
- 它暴露了Broadcast<T>(T, T, string)方法,該方法通過IMessenger實(shí)例(可以從Messenger屬性獲得)發(fā)送PropertyChangedMessage<T>消息。這可以用來輕松傳播viewmodel中的變化,而不需要手動(dòng)地檢索Messenger實(shí)例來使用。該方法通過各種SetProperty方法的重載來使用,這些方法還有一個(gè)附加的bool broadcast屬性,用于指示是否也發(fā)送消息。
下面有一個(gè)viewmodel的示例,它在激活時(shí)接收LoggedInUserRequestMessage 消息:文章來源:http://www.zghlxwxcb.cn/news/detail-501532.html
public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
public void Receive(LoggedInUserRequestMessage message)
{
// 處理消息的代碼
}
}
在以上例子中,OnActivated自動(dòng)注冊實(shí)例作為LoggedInUserRequestMessage 消息的接收者,使用該方法作為要調(diào)用的動(dòng)作。使用IRecipient<TMessage>接口并不是強(qiáng)制的,注冊也可以手動(dòng)完成(甚至只使用內(nèi)聯(lián)lambda表達(dá)式):文章來源地址http://www.zghlxwxcb.cn/news/detail-501532.html
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
}
}
到了這里,關(guān)于CommunityToolkit.Mvvm學(xué)習(xí)筆記(3)——ObservableRecipient的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!