首页 > 其他分享 >CommunityToolkit.Mvvm

CommunityToolkit.Mvvm

时间:2023-07-29 11:58:24浏览次数:27  
标签:CommunityToolkit Mvvm Default WeakReferenceMessenger MVVMToken 消息 模块 NET

包是.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>();   

标签:CommunityToolkit,Mvvm,Default,WeakReferenceMessenger,MVVMToken,消息,模块,NET
From: https://www.cnblogs.com/wesson2019-blog/p/17589570.html

相关文章

  • Rxjava与MVVM框架配合使用
    RxJava与MVVM框架配合使用介绍在现代的移动应用程序开发中,MVVM(Model-View-ViewModel)架构模式变得越来越流行。它是一种将业务逻辑与用户界面分离的设计模式,它的目标是提高代码的可维护性和可测试性。而RxJava是一种响应式编程库,它可以简化异步编程,并提供了丰富的操作符来处理数据......
  • Elm 和 Jetpack Compose 殊途同归及 MVVM 缺点分析
    Html.lazy·AnIntroductiontoElm可能搞vdom的都会到lazyrenderer这一步,react可能也可以这么搞或者已经这么搞了我不知道,Elm提到的keyedreact也是一个主要特性:Html.keyed·AnIntroductiontoElm但添加元素、删除元素、元素交换位置、以及元素移动位置的问题真......
  • wpf ICommand接口 MVVM
    先来点儿抽象的,在mvvm编程模式的命令中,有两个主要的角色,invoker和receiverinvokerinvoker是一段可以执行一定逻辑的代码一般的,它是在UI框架的context中的用户与之交互的UI元素。receiverreceiver是invoker触发时会执行的逻辑在MVVM 中,receiver通常是viewmodel中需要被调......
  • WINUI 引入 CommunityToolkit.WinUI.UI进行数据验证
     先在xaml命名空间中引入  xmlns:ui="using:CommunityToolkit.WinUI.UI"textbox中进行IP验证如下:<TextBoxx:Name="textBox"Width="200"Height="30"Background="AliceBlue"ui:TextBoxExten......
  • WPF 在MVVM模式下应用动画
    一个简单的需求:当程序发生异常时候,在界面上动画显示异常信息。这个需求看似简单,只需要try……catch到异常,然后把异常的信息写入界面就OK了。但在MVVM时,就不是这么简单了。MVVM模式下,追求前后端的分离。然后catch到的异常,也只能在后台代码中。如果传递到前台呢?这自然就想到了Bin......
  • WPF MVVM之点滴分享
    我并不打算长篇累牍的介绍什么是MVVM。我尽量简洁的介绍,并把自己的经验分享给大家。一、关于MVVMM:Model,数据模型(后台存储数据的类)V:View,视图(大部分情况下就是窗体,用来与用户交互)VM:ViewModel,视图模型。它的作用是连接Model与View,操作Model与View。如图所示......
  • WPF入门教程系列二十九 ——DataGrid使用示例MVVM模式(7)
    WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window介绍WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一) 接上文WPF......
  • Vue(五):Vue中的MVVM
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>Vue中的MVVM</title><scripttype="text/javascript"src="../js/vue.js"></script></head><body>......
  • Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救
    作者:唐子玄MVI架构有三大关键词:“唯一可信数据源”+“单向数据流”+“响应式编程”,以及一些关键概念,比如Intent,State。理解这些概念之后,能更轻松地阅读本文。(强烈建议从第一篇开始阅读)引子在上一篇中,用MVI重构了“新闻流”这个业务场景。本篇在此基础上进一步拓展,引入MVI中......
  • Jetpack系列-Room+ViewModel+LiveData+ViewBinding实现MVVM
    Room能和LiveData很好的结合实现MVVM,Room可以利用LiveData的观察者模式,感知Lifecyle的状态,实现数据驱动UI,避免MVP模式下更新UI需要大量回调接口的繁琐。下面整合Room、ViewModel、LiveData、ViewBinding,实现一个简单的MVVM示例项目。1引入依赖引入ViewModel依赖:dependencies{......