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;定義事件聚合器

然后獲取事件聚合器實例

 this.eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();

  並通過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

提取碼:添加小編微信zls20210502獲取

技術群: 需要進技術群的添加小編微信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 為項目設置全局樣

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM