CommunityToolkit.Mvvm
包是.NET提供的一个现代、快速且模块化的 MVVM 库。
此包面向 .NET Standard,因此可在任何应用平台上(UWP、WinForms、WPF、Xamarin、Uno 等)和运行时上(.NET Native、.NET Core、.NET Framework或 Mono)使用。
其他MVVM库有:Prism,常用于WPF应用。
Messenger 发送消息
接口 IMessenger 常用于在不同对象之间交换消息。这可将应用程序的不同模块分离,而无需保留对所引用类型的强引用。
还可以将消息发送到特定通道,由令牌唯一标识,并在应用程序的不同部分中过滤接收处理。
WeakReferenceMessenger
MVVM Toolkit提供两种实现,WeakReferenceMessenger 在内部使用弱引用,为接收者提供自动内存管理。更易于使用,常用于要求不高的场景中。
StrongReferenceMessenger
在内部使用强引用,要求在不需要接收者时手动取消订阅收件人,这样可以提高性能和更少的内存使用。
WeakReferenceMessenger、StrongReferenceMessenger都提供了一个 Default 信使实例。
如果需要,也可以创建多个信使实例。例如,DI服务将不同的信使实例注入应用程序的不同模块(在同一进程中运行的多个窗口)中。
MVVMClear(this);
// 模块1 发送
MVVMSend(MVVMToken.InfoHandleMessage, infoList.DeepCopy());
// 模块2 处理
MVVMRegister<List>(this, MVVMToken.InfoHandleMessage, OnMessageHandler);
private void OnMessageHandler(object recipient, Listlist)
{
if (IsDisposed) // 主窗体关闭,不处理响应
{
return;
}
// TODO 如果多次响应,一般都是 Clear 没有执行,有重复注册的行为
}
MVVMSend(MVVMToken.InfoHandleMessage, 1);
MVVMRegister(this, MVVMToken.InfoHandleMessage, OnMessageHandler);
private void OnMessageHandler(object recipient, int value)
{
// TODO
}
封装注册、发送等功能,可以发送任意类型的消息实体。
/// <summary>
/// 消息注册响应
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="recipient">消息接受者</param>
/// <param name="token">通道标识</param>
/// <param name="action">消息处理程序</param>
public static void MVVMRegister<TMessage>(object recipient, MVVMToken token, Action<object, TMessage> action)
{
WeakReferenceMessenger.Default.Register<ValueChangedMessage<TMessage>, string>(recipient, token.ToString(), (r, m) =>
{
action.Invoke(r, m.Value);
});
}
/// <summary>
/// 消息发送
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="token">通道标识</param>
/// <param name="message">消息对象</param>
public static void MVVMSend<TMessage>(MVVMToken token, TMessage message)
{
var msg = new ValueChangedMessage<TMessage>(message);
WeakReferenceMessenger.Default.Send(msg, token.ToString());
}
/// <summary>
/// 取消所有消息注册
/// </summary>
/// <param name="recipient">消息接受者</param>
public static void MVVMClear(object recipient)
{
WeakReferenceMessenger.Default.UnregisterAll(recipient);
}
/// <summary>
/// 消息通道枚举
/// </summary>
public enum MVVMToken
{
/// <summary>
/// 信息处理消息
/// </summary>
InfoHandleMessage,
};
AsyncRequestMessage 异步请求消息
// 消息类型定义
public class LoggedInUserRequestMessage : AsyncRequestMessage<User>
{
}
// 模块1(MyViewModel) 注册
WeakReferenceMessenger.Default.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) =>
{
m.Reply(r.GetCurrentUserAsync()); // 回复异步方法
});
// 模块2 请求信息
User user = await WeakReferenceMessenger.Default.Send<LoggedInUserRequestMessage>();