序文
ページコミュニケーションを実現するには、グローバルイベントのサブスクリプションと公開機能が必要です。無関係な 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 ページに対応して、xxxViewEvent が定義されます。
各 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 は多くのソリューションを提供しますが、実際に必要なのは最もシンプルで使いやすいソリューションだけです。ページ通信ではルーティング通信は一切不要です。ページジャンプが完了すると、すぐにそのページと通信できます。私たちが必要としているのは、統一されたエレガントなソリューションです。