You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVVM Toolkit Messenger消息发送后接收方无响应问题求助

问题分析与修复方案

核心问题1:消息发送时机错误

你当前在EditTest()里先发送消息,再执行导航。此时CreateTestPageViewModel还未被实例化,自然无法接收到提前发送的消息。

修复:调整发送消息与导航的顺序

先等待导航完成,再发送消息,确保接收方已经完成注册:

[RelayCommand]
async Task EditTest()
{
    // 先导航到目标页面,等待ViewModel初始化完成
    await GoToCreateTestPage();
    // 再发送消息
    WeakReferenceMessenger.Default.Send(new TestMessage(SelectedTest));
}

核心问题2:接收方的类型转换错误与UI更新问题

接收方代码里存在两个明显错误,会导致即使收到消息也无法正确更新UI:

  1. 直接将IEnumerable<Question>强制转换为Question,会抛出InvalidCastException,中断后续逻辑。
  2. 直接赋值私有字段testName,而非使用ObservableProperty生成的公共属性TestName,无法触发UI更新。

修复接收方的消息处理逻辑

WeakReferenceMessenger.Default.Register<TestMessage>(
    this,
    (recipient, message) =>
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            // 使用自动生成的公共属性,触发PropertyChanged
            TestName = message.Value.Name;
            // 遍历IEnumerable,逐个添加问题
            foreach (var question in message.Value.Questions)
            {
                Questions.Add(question);
            }
        });
    });

额外验证点

  • 确认SelectedTest不为null:在发送消息前可以加个判断,避免发送空消息:
    if (SelectedTest == null) return;
    WeakReferenceMessenger.Default.Send(new TestMessage(SelectedTest));
    
  • 调试时在消息发送和接收的代码块中加断点,确认消息是否被发送、接收方是否进入回调。
  • 检查项目中WeakReferenceMessenger是否使用同一个默认实例(通常默认是单例,无需额外配置)。

内容的提问来源于stack exchange,提问作者Kowari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:22:14