MVVM Toolkit Messenger消息发送后接收方无响应问题求助
问题分析与修复方案
核心问题1:消息发送时机错误
你当前在EditTest()里先发送消息,再执行导航。此时CreateTestPageViewModel还未被实例化,自然无法接收到提前发送的消息。
修复:调整发送消息与导航的顺序
先等待导航完成,再发送消息,确保接收方已经完成注册:
[RelayCommand] async Task EditTest() { // 先导航到目标页面,等待ViewModel初始化完成 await GoToCreateTestPage(); // 再发送消息 WeakReferenceMessenger.Default.Send(new TestMessage(SelectedTest)); }
核心问题2:接收方的类型转换错误与UI更新问题
接收方代码里存在两个明显错误,会导致即使收到消息也无法正确更新UI:
- 直接将
IEnumerable<Question>强制转换为Question,会抛出InvalidCastException,中断后续逻辑。 - 直接赋值私有字段
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
相关产品推荐
相关产品推荐

