包是.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服务将不同的信使实例注入应用程序的不同模块(在同一进程中运行的多个窗口)中。
// 模块1 发送
MVVMSend(MVVMToken.InfoHandleMessage, infoList.DeepCopy());
// 模块2 处理
MVVMRegister<List>(this, MVVMToken.InfoHandleMessage, OnMessageHandler);
private void OnMessageHandler(object recipient, Listlist)
{
// 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) where TMessage : class
{
var messageHandler = (MessageHandler<object, TMessage>)Delegate.CreateDelegate(typeof(MessageHandler<object, TMessage>), action.Target, action.Method);
WeakReferenceMessenger.Default.Register<TMessage, string>(recipient, token.ToString(), messageHandler);
}
/// <summary>
/// 消息发送
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="token">通道标识</param>
/// <param name="message">消息对象</param>
public static void MVVMSend<TMessage>(MVVMToken token, TMessage message) where TMessage : class
{
if (message == null)
{
return;
}
WeakReferenceMessenger.Default.Send(message, token.ToString());
}
/// <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>();
- CommunityToolkit Mvvmcommunitytoolkit文章mvvm communitytoolkit mvvm communitytoolkit mvvm8 mvvm ioc communitytoolkit messenger mvvm mvvm communitytoolkit第三方microsoft communitytoolkit mvvm net communitytoolkit消息mvvm8 mvvm 循序渐进communitytoolkit handycontrol mvvm 写法communitytoolkit viewmodel mvvm8 communitytoolkit