WPF がグローバル サブスクリプション発行イベントを設定する方法

記事ディレクトリ

序文

ページコミュニケーションを実現するには、グローバルイベントのサブスクリプションと公開機能が必要です。無関係な 2 つのページが中間ボリュームを介して通信できるようにします。

コード

IEventAggregator: メッセージ サブスクリプション コレクション

Prismが提供するメッセージ購読機能です。次のように使用します

サブスクリプションのタイプ、つまりキーワードを設定します。

PubSubEvent<><>里面存放的是订阅的数据类型,推荐使用元祖
///
public class EventClass : PubSubEvent<string>
{
    
    

}

ViewModel で使用される公式のケース


private readonly IEventAggregator eventAggregator;
 public string MyTitle {
    
     get; set; }
 public ViewAViewModel(IEventAggregator eventAggregator)
 {
    
    
     
     //通过Prism注入得到
     this.eventAggregator = eventAggregator;

	//订阅
     eventAggregator.GetEvent<EventClass>().Subscribe(res =>
     {
    
    
         Debug.WriteLine(res.ToString());
     });
     //推送
	 eventAggregator.GetEvent<EventClass>().Publish("我是侧边栏传来的值:事件通知");
 }

ヒント: サブスクリプションで渡される値は、EventClass: PubSubEvent<string> に設定されている <> のタイプに関連しています。

しかし、テストしたところ、ページをまたいで通信できないようです。

ロジック変更

    public partial class App
    {
    
    
    	//在App.xaml中进行声明
        public static IEventAggregator EventAggregator {
    
     get;set; } = new EventAggregator();
        
    }

各 xxxView ページに対応して、xxx​​ViewEvent が定義されます。

各 ViewModel のコンストラクターで独自の ViewEvent をサブスクライブし、他のページがイベントを直接プッシュしてルーティング値の転送を実現できるようにします。戻り値をキーと値の形式で解析します。

実証事例

public ViewAViewModel(IEventAggregator eventAggregator)
        {
    
    
            
            App.EventAggregator.GetEvent<ViewAEvent>().Publish("我是ViewModel传来的值");

            App.EventAggregator.GetEvent<ViewAEvent>().Subscribe(res =>
            {
    
    
                Debug.WriteLine(res.ToString());
                MyTitle = res;
            });
        }

要約する

Prism と WPF は多くのソリューションを提供しますが、実際に必要なのは最もシンプルで使いやすいソリューションだけです。ページ通信ではルーティング通信は一切不要です。ページジャンプが完了すると、すぐにそのページと通信できます。私たちが必要としているのは、統一されたエレガントなソリューションです。

おすすめ

転載: blog.csdn.net/qq_44695769/article/details/131928024