WPF 消息传递简明教程
独立观察员 2023 年 4 月 24 日
0、说明
参考:https://www.cnblogs.com/cdaniu/p/16852620.html
使用包:CommunityToolkit.Mvvm(8.1.0)
1、订阅
让需要使用消息的 ViewModel 继承 ObservableRecipient,构造函数中设置 IsActive=true:
重写 OnActivated () 和 OnDeactivated () 方法:
#region 消息处理/// <summary>
/// 注册消息接收
/// </summary>
protected override void OnActivated()
{WeakReferenceMessenger.Default.Register<MainWindowViewModel, MyMessage, string>(this,nameof(MyMessage), OnReceiveMessage);
}/// <summary>
/// 收到消息时的处理方法
/// </summary>
/// <param name="recipient">接收者</param>
/// <param name="message">消息</param>
private void OnReceiveMessage(MainWindowViewModel recipient, MyMessage message)
{//处理逻辑;
}/// <summary>
/// 注销消息接收
/// </summary>
protected override void OnDeactivated()
{base.OnDeactivated();WeakReferenceMessenger.Default.Unregister<MyMessage, string>(this, nameof(MyMessage));
}#endregion
解释:
2、发送消息
var message = new MyMessage()
{//属性赋值,
};
WeakReferenceMessenger.Default.Send(message, nameof(MyMessage));
3、注意事项
主要用法就是上面两点,还是挺简单的,但是网上的文章却看得人云里雾里的。这一节说一些注意事项。
3.1、消息类型不要混用
消息类应当是每个消息专用的,推荐使用 sealed 标记:
3.2、订阅要在发送之前执行
这一条大家可能会觉得这有什么好提醒的,本来就要这样啊。但是,实际写的时候,还是容易发生执行到发送的逻辑时,订阅的那部分代码实际还没执行,通常就是那个 ViewModel 还没出生呢。不过这个也很好排查出来,一般出现发了消息,但是消息处理方法那里没反应,就是这个问题了。解决方法就是让订阅的对象先生成出来即可,只不过有的时候这样可能没什么道理,大家有更好的方法,欢迎交流。
就说这么多吧,感谢阅读。
原创文章,转载请注明: 转载自 独立观察员 (dlgcy.com)
本文链接地址:[WPF 消息传递简明教程](http://dlgcy.com/toolkit-mvvm-message/)
关注微信公众号 独立观察员博客(DLGCY_BLOG) 第一时间获取最新文章
WPF
WPF 属性变动后的业务处理及恢复原始值的方法
我向 ChatGPT 讨教了一下 WPF 中的行为 Behavior
使用通用附加属性来减少 WPF 元素自定义样式的多余代码
几十款 WPF 控件 - UI 库,总有一款适合你
WPF 用户控件分享之边上带输入框的圆圈
分享一个 WPF 气泡弹框
WPF 表单验证之 INotifyDataErrorlnfo 接口的使用示例
[翻译] WPF 中用户控件 DataContext/Binding 和依赖属性的问题
OxyPlot 导出图片及 WPF 元素导出为图片的方法
让 WPF 的 RadioButton 支持再次点击取消选中的功能
WPF DataGrid 如何将被选中行带到视野中
WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题
WPF DataGrid 通过自定义表头模拟首行固定
WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换
【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF
WPF 使用 Expression Design 画图导出及使用 Path 画图
WPF MVVM 弹框之等待框
解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)
WPF 消息框 TextBox 绑定新数据时让光标和滚动条跳到最下面
真・WPF 按钮拖动和调整大小
WPF MVVM 模式下的弹窗
WPF 让一组 Button 实现 RadioButton 的当前样式效果
WPF 原生绑定和命令功能使用指南
WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘
在WPF的MVVM模式中使用OCX组件
第三方库使用
WPF 依赖注入之 Microsoft.Extensions.DependencyInjection
WPF 表格控件 ReoGrid 的简单使用
OxyPlot.WPF 公共属性一览
OxyPlot.Wpf 图表控件使用备忘