Fork me on Github

WeakReferenceMessenger

1.消息注册

        private void Page_Unload(object sender, RoutedEventArgs e)
        {
            WeakReferenceMessenger.Default.UnregisterAll(this);
        }

        private void RegisterEvent()
        {
            WeakReferenceMessenger.Default.Register<EventModel,string>(
                this,
                "EquipmentConfigView_PageEvents",
                OnPageEventsReceived
            );
        }

        private void OnPageEventsReceived(object recipient, EventModel message)
        {
            PageEvents(message);
        }

        private void PageEvents(EventModel model)
        {
            switch (model.menu_name)
            {
                case "RefreshGrid":
                    ViewModel.PageIndex = int.Parse(model.param);

                    Search_Click(null, null);
                    break;
            }
        }
  • WeakReferenceMessenger.Default:获取全局默认的消息器实例(单例),所有组件共用这个实例收发消息。
  • Register<EventModel, string>:泛型参数说明:
    • 第一个泛型 EventModel:消息的类型(你自定义的消息载体,包含 menu_nameparam 等数据)。
    • 第二个泛型 string:令牌的类型(这里用字符串作为令牌,也可以用其他类型如 enum)。
     
  • 参数 1 this:表示 “谁来接收消息”,这里是当前类的实例(比如某个 View 或 ViewModel)。
  • 参数 2 "EquipmentConfigView_PageEvents":消息令牌,相当于 “消息的唯一标识”。只有发送方用这个令牌发送消息时,当前接收方才会响应;其他令牌的消息会被忽略,避免消息混乱。
  • 参数 3 OnPageEventsReceived:消息接收后的回调方法,消息到达时会执行这个方法。

2.消息发送

 WeakReferenceMessenger.Default.Send(
     new EventModel { menu_name = "RefreshGrid", param = $"{PageIndex}" },
     "EquipmentConfigPage_PageEvents"
 );

 

接收方调用 RegisterEvent() 注册消息监听(通常在页面初始化 / 构造函数中执行)。

发送方在需要的时机(比如按钮点击、数据加载完成)调用 Send 发送消息。

WeakReferenceMessenger 会根据 “消息类型 + 令牌” 找到对应的接收方,触发 OnPageEventsReceived 回调。

posted @ 2026-03-03 08:30  昂昂呀  阅读(33)  评论(0)    收藏  举报