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 还没出生呢。不过这个也很好排查出来,一般出现发了消息,但是消息处理方法那里没反应,就是这个问题了。解决方法就是让订阅的对象先生成出来即可,只不过有的时候这样可能没什么道理,大家有更好的方法,欢迎交流。
就说这么多吧,感谢阅读。