WPF CommunityToolkit.Mvvm 中的 ObservableRecipient
是什么?
ObservableRecipient
是 .NET Community Toolkit MVVM 庫中的一個核心類,繼承自 ObservableObject
。它專為 WPF 應用設計,提供以下核心功能:
- 基礎數據綁定支持:通過
INotifyPropertyChanged
實現屬性變更通知。 - 消息傳遞機制:內置
IMessenger
接口實現,允許 ViewModel 之間松耦合通信。 - 激活狀態管理:提供
IsActive
屬性,用于控制 ViewModel 的生命周期(如頁面導航時自動激活/停用)。
怎么用?
1. 基本實現
public class MyViewModel : ObservableRecipient
{private string _name;public string Name{get => _name;set => SetProperty(ref _name, value); // 繼承自 ObservableObject}public MyViewModel(IMessenger messenger) : base(messenger) // 依賴注入 IMessenger{// 注冊消息監聽Messenger.Register<DataUpdatedMessage>(this, (r, m) => {// 處理消息邏輯});}protected override void OnActivated(){// ViewModel 激活時執行(如頁面加載)}
}
2. 發送消息
// 在其他 ViewModel 中發送消息
Messenger.Send(new DataUpdatedMessage("New Data"));
3. XAML 綁定
<TextBlock Text="{Binding Name}" />
優勢
-
解耦通信
- 通過消息機制替代直接引用,ViewModel 無需相互知曉。
- 例如:頁面 A 的 ViewModel 發送消息,頁面 B 的 ViewModel 自動響應。
-
生命周期管理
- 自動處理
OnActivated
/OnDeactivated
,避免資源泄漏。 - 適合導航場景:離開頁面時自動停用相關邏輯。
- 自動處理
-
代碼簡潔性
- 繼承即用,無需重復實現
INotifyPropertyChanged
。 - 消息注冊/發送內置簡化,對比傳統事件減少 50% 樣板代碼。
- 繼承即用,無需重復實現
-
可測試性
- 消息機制允許單元測試中模擬通信。
- 依賴注入
IMessenger
便于 Mock 測試。
典型應用場景
- 跨頁面數據同步(如:設置修改后全局更新)
- 復雜工作流的組件協作
- 需要響應式生命周期的模塊(如實時數據訂閱)
最佳實踐:
在大型 WPF 項目中優先使用ObservableRecipient
而非直接繼承ObservableObject
,尤其當涉及多 ViewModel 交互時,能顯著提升架構清晰度。