網站首頁 編程語言 正文
常見的MVVM框架
眾所周知, 如果你了解WPF當中的ICommand, INotifyPropertyChanged的作用, 就會發現眾多框架都是基于這些進行擴展, 實現其通知、綁定、命令等功能。
對于不同的MVVM框架而言, 大體使用上會在聲明方式上的差異, 以及特定功能上的差別。
下面列舉了常用的3個MVVM框架,他們的一些差異。如下所示:
功能↓ / →框架名 | Prism | Mvvmlight | Micorosoft.Toolkit.Mvvm |
通知 | BindableBase | ViewModelBase | ObservableObject |
命令 | DelegateCommand | RelayCommand | Async/RelayCommand |
聚合器 | IEventAggregator | IMessenger | IMessenger |
模塊化 | √ | × | × |
容器 | √ | × | × |
依賴注入 | √ | × | × |
導航 | √ | × | × |
對話 | √ | × | × |
正如你所見, 各個框架之間都有各自的通知、綁定、事件聚合器等基礎的功能, 而Prsim自帶的依賴注入、容器、以及導航會話等功能, 可以為你提供更加強大的功能。
當然,在實際的開發過程當中, 可以根據實際的功能需求, 對不同的框架選型, 同時這也需要你對各個框架之間的優缺點進行判斷。
那么, 下面將主要介紹Prism當中的通知、綁定等功能。
BindableBase
如果在此之前, 你用類型mvvmlight框架, ViewModel繼承的類如下:
public class TestViewModel : ViewModelBase { private string _message; public string Message { get { return _message; } set { _message = value; RaisePropertyChanged(); } } }
在Prism當中, 你需要繼承于BindableBase, 如下所示:
public class TestViewModel : BindableBase { private string _message; public string Message { get { return _message; } set { _message = value; RaisePropertyChanged(); } } }
Command
在mvvmlight/microsoft.toolkit.mvvm中, 聲明Command,如下:
public class TestViewModel : ViewModelBase { public RelayCommand SendCommand { get; set; } public RelayCommand<string> SendMessageCommand { get; set; } }
在Prism當中, 你可以使用DelegateCommand及帶參數的Command, 如下:
public class TestViewModel : ViewModelBase { public DelegateCommand SendCommand { get; set; } public DelegateCommand<string> SendMessageCommand { get; set; } }
CompositeCommand
對于單個Command而言, 只是觸發單個對應的功能, 而復合命令是Prism當中非常強大的功能, CompositeCommand簡單來說是一個父命令, 它可以注冊N個子命令, 如下所示:
當父命令被激活, 它將觸發對所有的子命令, 如果任意一個命令CanExecute=false,它將無法被激活,如下所示:
IEventAggregator
- 松耦合基于事件通訊
- 多個發布者和訂閱者
- 微弱的事件
- 過濾事件
- 傳遞參數
- 取消訂閱
該功能主要作用為, 事件聚合器負責接收訂閱以及發布消息。訂閱者可以接收到發布者發送的內容。
例如: AViewModel訂閱了一個消息接收的事件, 然后BViewModel當中給指定該事件推送消息,此時AViewModel接收BViewModel推送的內容。如下所示:
示例,下面演示如何創建訂閱及發布:
//創建事件 public class SavedEvent : PubSubEvent<string> { } //發布 IEventAggregator.GetEvent<SavedEvent>().Publish("some value"); //訂閱 IEventAggregator.GetEvent<SavedEvent>().Subscribe(.Subscribe(message=> { //do something });
Filtering Events
在實際的開發過程當中,我們往往會在多個位置訂閱一個事件, 但是對于訂閱者而言, 他并不需要接收任何消息, 如下所示:
在Prism當中, 我們可以指定為事件指定過濾條件, 如下所示:
eventAggregator.GetEvent<MessageSentEvent>() .Subscribe(arg => { //do something }, ThreadOption.PublisherThread, false, //設置條件為token等于“MessageListViewModel” 則接收消息 message => message.token.Equals(nameof(MessageListViewModel)));
關于Subscribe當中的4個參數, 詳解:
- 1.action: 發布事件時執行的委托。
- 2.ThreadOption枚舉: 指定在哪個線程上接收委托回調。
- 3.keepSubscriberReferenceAlive: 如果為true,則Prism.Events.PubSubEvent保留對訂閱者的引用因此它不會收集垃圾。
- 4.filter: 進行篩選以評估訂閱者是否應接收事件。
Unsubscribe
為注冊的消息取消訂閱, Prism提供二種方式取消訂閱,如下:
1.通過委托的方式取消訂閱
var event = IEventAggregator.GetEvent<MessageSentEvent>(); event.Subscribe(OnMessageReceived); event.Unsubscribe(OnMessageReceived);
2.通過獲取訂閱者token取消訂閱
var _event = eventAggregator.GetEvent<MessageSentEvent>(); var token = _event.Subscribe(OnMessageReceived); _event.Unsubscribe(token);
原文鏈接:https://www.cnblogs.com/zh7791/p/14140662.html
相關推薦
- 2023-11-15 latex報錯:Misplaced alignment tab character &. .
- 2022-08-07 Go?Grpc?Gateway兼容HTTP協議文檔自動生成網關_Golang
- 2022-12-15 Golang控制協程執行順序方法詳解_Golang
- 2023-06-18 C#?Marshal類基本概念和入門實例講解_C#教程
- 2022-07-22 C語言編寫九九乘法表,實現不同三角形形狀表格輸出
- 2022-03-28 c語言經典習題之逆序字符串詳解_C 語言
- 2022-11-18 python標準庫?datetime的astimezone設置時區遇到的坑及解決_python
- 2022-07-27 Python?虛擬環境的價值和常用命令詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支