C# WPF MVVM模式Prism框架下事件发布与订阅
01
—
前言
? ? 處理同模塊不同窗體之間的通信和不同模塊之間不同窗體的通信,Prism提供了一種事件機制,可以在應用程序中低耦合的模塊之間進行通信,該機制基于事件聚合器服務,允許發布者和訂閱者之間通過事件進行通訊,且彼此之間沒有引用,這就實現了模塊之間低耦合的通信方式。簡單來說就是提供了一個多播發布/訂閱功能。Prism的事件聚合器,這玩意實現原理是觀察者模式,觀察者模式也就是常說的發布/訂閱模式。
02
—
創建事件
這里我們創建一個公共接口類PersonInfoEven并繼承自PubSubEvent,并傳入一個PersonInfo對象
public class PersonInfo{public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }public override string ToString() {string report = $"[Name] = [{Name}],[Age] = [{Age}],[Sex] = [{Sex}]";return report;}}public class PersonInfoEven : PubSubEvent<PersonInfo>{}03
—
訂閱事件
? IEventAggregator eventAggregator;定義事件聚合器
然后獲取事件聚合器實例
并通過IEventAggregator的GetEvent獲取定義的消息,再通過Subscribe方法注冊,Subscribe是一個委托方法
eventAggregator.GetEvent<PersonInfoEven>().Subscribe(ShowNews);private void ShowNews(PersonInfo obj){TxtLabel = $"{obj.ToString()}";}04
—
發布事件
?//創建一個命令,當執行該命令時執行發布事件的邏輯 PubSubEventCommand = new DelegateCommand(PubSubEventMessage);//發布事件方法 private void PubSubEventMessage(){eventAggregator.GetEvent<PersonInfoEven>().Publish(new PersonInfo() {Name ="zyr",Age = 18,Sex = "nan" });}這樣,一個發布/訂閱的事件就完成了,也可以在任何時候取消事件注冊,只需要調用Unsubscribe方法即可
eventAggregator.GetEvent<PersonInfoEven>().Unsubscribe(ShowNews);//解除訂閱由于它是多播的,你可以在任意多個地方進行發布或訂閱。
05
—
效果演示
06
—
源碼
鏈接:https://pan.baidu.com/s/1H3HtTRAZVS-FlReTe00yxQ
提取碼:在下面公眾號后臺,發送:提取碼2,即可獲取
技術群:?需要進技術群的添加小編微信zls20210502 ,備注:加群;
07
—
經典回顧
? ? ? 因為公眾號平臺更改了推送規則,如果不想錯過內容,記得讀完點一下“贊”和“在看”,這樣每次新文章推送才會第一時間出現在你的訂閱列表里。點擊“贊”和“在看”支持我們吧!
往期推薦
C# WPF框架Caliburn.Micro入門實例1
C# WPF MVVM項目實戰(進階①)
C# WPF MVVM項目實戰(進階②)
C# WPF框架Caliburn.Micro快速搭建
C# WPF項目實戰
C# WPF mvvm模式下combobox綁定(list<enum>、Dictionary<int,string>)
C# WPF MVVM模式下在主窗體顯示子窗體并獲取結果
C# WPF Caliburn.Micro框架下利用Mef加載其它項目界面
C# WPF文本框TextEdit不以科學計數法顯示
C# 通過正則表達式來限制控件輸入有效性
C# datagridview、datagrid、GridControl增加行號
C# =>符號的使用
C# 無意間寫了一段線程死鎖的代碼
C# 看懂這100+行代碼,你就真正入門了(經典)
C# WPF項目實戰(經典)
WPF 如何修改button圓角(經典)
WPF XAML 為項目設置全局樣式
總結
以上是生活随笔為你收集整理的C# WPF MVVM模式Prism框架下事件发布与订阅的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 6新特性试用 | record
- 下一篇: 如何通过 C# 判断某个 IP 是否属于