MVVMToolkit入门教程

简介: MVVMLight已经停止维护,可以考虑MVVMToolkit来替代,MVVMToolkit官方文档两个框架的基本使用方法类似,下面介绍一下不同之处(建议查看一下上一篇关于MVVMLight的文章)。

MVVMToolkit

MVVMLight已经停止维护,可以考虑MVVMToolkit来替代,MVVMToolkit官方文档两个框架的基本使用方法类似,下面介绍一下不同之处。

Messenger

//发送

WeakReferenceMessenger.Default.Send<string>("hello");

//注册1

WeakReferenceMessenger.Default.Register<string>(this, DoMessage);

//注册2

WeakReferenceMessenger.Default.Register<MessageObject>(this, DoMessage);

//注册3,不需要Register

//类的继承,使用ObservableRecipient替换ObservableObject,并继承IRecipient接口

//用来接收消息,这样就不需要注册

//必须打开消息开关

this.IsActive=true;

publicvoidReceive(stringmessage)

{

  //凡是相应类型的都可以收到信息

  //如何实现精准接收,要自定义一个类

}

IoC

仿照MVVMLight,新建ViewModelLocator类。

需要nuget安装Microsoft.Extensions.DependencyInjection

publicclassViewModelLocator

{

    publicstaticIServiceProviderserviceProvider { get; privateset; }

    publicViewModelLocator()

    {

        serviceProvider=GetService();

    }

   privateIServiceProviderGetService()

    {

        //实例化容器对象

        varservice=newServiceCollection();

        //注册项目需要的对象

        service.AddSingleton<MainViewModel>();

        returnservice.BuildServiceProvider();

    }

    publicMainViewModelMain

    {

        get=>serviceProvider.GetService<MainViewModel>();

    }

}

App.xmal

<Application.Resources>

   <vm:ViewModelLocatorx:Key="Locator"/>

</Application.Resources>

window.xaml中使用

DataContext="{Binding Source={StaticResource Locator},Path=Main}"

AsnycRelayCommand

异步命令

publicICommandBtnCommand { set; get; }

//异步命令必须在构造方法中创建

BtnCommand=newAsyncRelayCommand(DoCommand);

privateasyncTask<String>DoCommand()

{

   awaitTask.Delay(3000);

   return"hello";

}

如果在页面要获取异步命令的返回值,需要做一个转换

publicclassTaskResultConverter : IValueConverter

{

   publicobjectConvert(objectvalue, TypetargetType, objectparameter, CultureInfoculture)

   {

       if (valueisTasktask)

       {

           //  安装了Microsoft.Toolkit

           returntask.GetResultOrDefault();

       }

       returnnull;

   }

   publicobjectConvertBack(objectvalue, TypetargetType, objectparameter, CultureInfoculture)

   {

       thrownewNotImplementedException();

   }

}

页面

<Window.Resources>

   <local:TaskResultConverterx:Key="taskResult"/>

</Window.Resources>

<TextBlockText="{Binding BtnCommand.ExecutionTask, Converter={StaticResource taskResult}}"/>

<ButtonCommand="{Binding BtnCommand}"Content="OK"/>


相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
3424 0
|
8月前
|
人工智能 负载均衡 并行计算
DeepSeek-V3 高效训练关键技术分析
本文从模型架构、并行策略、通信优化和显存优化四个方面展开,深入分析了DeepSeek-V3高效训练的关键技术,探讨其如何以仅5%的算力实现对标GPT-4o的性能。
1379 146
|
11月前
|
机器学习/深度学习 人工智能 运维
智能运维:AI驱动的IT运维革命###
【10月更文挑战第21天】 随着数字化转型的深入,智能运维(AIOps)正逐步成为企业IT管理的核心。本文将探讨AI技术如何赋能运维领域,通过自动化、智能化手段提升系统稳定性和效率,降低运营成本,并分享实施智能运维的最佳实践与挑战应对策略。 ###
805 1
|
存储 缓存 监控
深入理解Java线程池ThreadPoolExcutor实现原理、数据结构和算法(源码解析)
Java线程池的核心组件包括核心线程数、最大线程数、队列容量、拒绝策略等。核心线程数是线程池长期维持的线程数量,即使这些线程处于空闲状态也不会被销毁;最大线程数则是线程池允许的最大线程数量,当任务队列已满且当前线程数未达到最大线程数时,线程池会创建新线程执行任务;队列容量决定了任务队列的最大长度,当新任务到来时,如果当前线程数已达到核心线程数且队列未满,任务将被放入队列等待执行;拒绝策略则定义了当线程池无法处理新任务时的行为,如抛出异常、丢弃任务等。
258 1
|
测试技术 C#
.NET单元测试使用Bogus或AutoFixture按需填充的几种方式和最佳实践
【7月更文挑战第13天】AutoFixture 和 Bogus 都是流行的 C#库,用于在单元测试中按需填充测试数据。以下是它们的几种使用方式和最佳实践:一、AutoFixture:1.直接定制 2.使用匿名函数 3.实现ICustomization接口 4.使用Build方法。 二、最佳实践Bogus:1.安装2.使用。
207 2
|
算法 测试技术 异构计算
【SAM模型超级进化】MobileSAM轻量化的分割一切大模型出现,模型缩小60倍,速度提高40倍,效果不减
【SAM模型超级进化】MobileSAM轻量化的分割一切大模型出现,模型缩小60倍,速度提高40倍,效果不减
|
存储 程序员 uml
【程序员必备】绘制架构图,流程图神器推荐
好的图形可以帮我们更好的表达自己,帮我们理清逻辑
|
C# 容器
WPF技术之StatusBar控件
WPF StatusBar控件用于在应用程序底部显示状态信息。它提供了一个容器,用于展示与应用程序相关的各种状态信息。
888 0
|
C# 虚拟化 开发者
WPF技术之ListBox控件
WPF ListBox控件是一种用于显示和选择多个项的常用控件。它可以展示任意类型的数据,并允许用户通过鼠标或键盘进行选择操作
1467 0
|
消息中间件 Prometheus 监控
统一观测|Prometheus 监测 RocketMQ
RocketMQ 如何接入 PrometheusRocketMQ 诞生于阿里内部的核心电商系统,是业务消息的首选 MQ 平台。上图是 RocketMQ 5.0 的系统全貌,在接入层、核心组件和底层运维方面做了非常大的改进,具有功能多样、高性能、高可靠、可观测、易运维等众多优势。Metrics、Tra...
390 1
统一观测|Prometheus 监测 RocketMQ