CommunityToolkit.Mvvm

发布时间 2023-07-29 11:49:02作者: wesson2019

包是.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, List list)
{
// 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>();