学习MvvmLight工具

news2024/11/17 9:56:26

最近学习了一下MvvmLight,觉得有些功能还是挺有特色的,所以记录一下

首先新建也给WPF程序

然后在Nuget里面安装MvvmLightLib 包,安装上面那个也可以,但是安装上面那个会自动在代码里面添加一些MvvmLight的demo ,安装MvvmLightLib比较纯净

安装完成后,在App.cs 里面重写一下OnStartup方法,让程序启动的时候初始一下IOC容器和DispatcherHelper。(其实这两步也可以放在其他地方,比如放在构造函数里面或者其他地方也是可以的,没有特殊要求)

 MvvmLight的依赖属性

新建一个 MainViewModel 类 

让实体类继承ViewModelBase类,然后在属性的set访问器里面加上RaisePropertyChanged();就实现了MVVM,这比WPF原生的MVVM简单很多

MvvmLight的命令绑定

然后在界面上绑定命令:

 <Button Content="把名字修改成张三" Command="{Binding BtnCommand}" CommandParameter="张三"></Button>

这个是带参数的命令,如果不需要带参数,那么直接把参数删掉就行

MvvmLight的messenger

这个是MvvmLight的最有亮点的功能了

Messenger.Default.Send("aaaa", "myToken");

第一个参数是发送消息的内容,第二个参数是token的名称,所有此toten的注册者都能收到消息

按钮点击发送后,构造函数中的两个注册者都能收到消息。注册者可以在Model中,或者在其他的地方都能收到,这比使用委托更简单。

MvvmLight跨线程访问控件

DispatcherHelper.CheckBeginInvokeOnUI(() =>
                {
                });

 这个方法可以跨线程访问控件,在实体类中不能用invoke的时候,就可以用这种方法

以上就是MvvmLight最实用的功能,其他花哨的功能我感觉用处不大

以下是完整代码:

app.cs

using CommonServiceLocator;
using GalaSoft.MvvmLight.Ioc;
using GalaSoft.MvvmLight.Threading;
using MvvmLightDemo.ViewModels;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace MvvmLightDemo
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            #region 注册MvvmLight的IOC

            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
            SimpleIoc.Default.Register<MainViewModel>();

            #endregion

            DispatcherHelper.Initialize();      //用于判断修改属性的时候是否处于UI线程,首先初始化一下

            base.OnStartup(e);
        }
    }
}

 MainWindow

<Window x:Class="MvvmLightDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MvvmLightDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="{Binding Name}"></TextBlock>

            <Button Content="把名字修改成张三" Command="{Binding BtnCommand}" CommandParameter="张三"></Button>

            <Button Click="Button_Click" Content="发送消息"></Button>

            <Button Click="Button_Click_1"  Content="使用子线程修改数据"></Button>

            <ItemsControl ItemsSource="{Binding NameList}">
                
            </ItemsControl>
        </StackPanel>
    </Grid>
</Window>
using CommonServiceLocator;
using GalaSoft.MvvmLight.Messaging;
using GalaSoft.MvvmLight.Threading;
using MvvmLightDemo.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MvvmLightDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var model = ServiceLocator.Current.GetInstance<MainViewModel>();
            this.DataContext = model;

            Messenger.Default.Register<string>(this, "myToken", (str) =>
            {
                Console.WriteLine(str);
            });

            Messenger.Default.Register<string>(this, "myToken", (str) =>
            {
                Console.WriteLine(str);
            });
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Messenger.Default.Send("aaaa", "myToken");
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Task.Run(() => {
                DispatcherHelper.CheckBeginInvokeOnUI(() =>
                {
                    var model = ServiceLocator.Current.GetInstance<MainViewModel>();        //在IOC容器中获取单例
                    model.NameList.Add("aaa");
                    model.NameList.Add("bbb");

                    model.Name = "34242";
                });
                
            });
        }
    }
}

MainViewModel

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MvvmLightDemo.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        #region MvvmLight的依赖属性

        private string name = "默认名字";

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                RaisePropertyChanged();     //加上了这行代码,属性就具有了通知功能
            }
        }

        #endregion

        private ObservableCollection<string> nameList = new ObservableCollection<string>() { "默认1", "默认2" };

        public ObservableCollection<string> NameList
        {
            get { return nameList; }
            set
            {
                nameList = value;
            }
        }

        #region MvvmLight的命令绑定

        private ICommand btnCommand;

        public ICommand BtnCommand
        {
            get
            {
                if (btnCommand == null)
                {
                    btnCommand = new RelayCommand<string>(DoCommand);
                }
                return btnCommand;
            }
            set { btnCommand = value; }
        }

        private void DoCommand(string str)
        {
            Name = str;
            Console.WriteLine(str);
        }
        #endregion

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零钱兑换II 组合总和 Ⅳ 爬楼梯(0-1背包)

零钱兑换II 但本题和纯完全背包不一样&#xff0c;纯完全背包是凑成背包最大价值是多少&#xff0c;而本题是要求凑成总金额的物品组合个数&#xff01; 回归本题&#xff0c;动规五步曲来分析如下&#xff1a; 确定dp数组以及下标的含义 dp[j]&#xff1a;凑成总金额j的货币组…

【MySQL】P10 事务(1)事务执行,提交与回滚

事务执行&#xff0c;提交与回滚基本概念什么是事务&#xff1f;什么是自动提交&#xff1f;错误事务案例解决方案方式一&#xff1a;控制事务方式二&#xff1a;手动提交与回滚自动提交更改为手动提交进行手动提交错误进行回滚基本概念 什么是事务&#xff1f; 每一个SQL语句…

Unity资源热更新框架

什么是热更新&#xff1f; 游戏上线后&#xff0c;玩家下载第一个版本&#xff08;1G左右或者更大&#xff09;&#xff0c;在之后运营的过程中&#xff0c;如果需要更换UI显示&#xff0c;或者修改游戏的逻辑&#xff0c;这个时候&#xff0c;如果不使用热更新&#xff0c;就需…

VS2008生产动态库、静态库调用案例

静态库创建静态库打开VS2008创建项目如下&#xff1a;选择静态库创建文件// add.h #ifndef _ADD_H_ #define _ADD_H_#include <stdio.h>#ifdef __cplusplus extern "C" { #endif__declspec(dllexport) int myAdd(int a, int b);#ifdef __cplusplus } #endif#e…

Linux:IO库函数

目录标准库IO函数一、fopen二、fwrite三、fread四、fseek五、fclose在编写程序时&#xff0c;离不开IO操作&#xff0c;最常见的IO操作就是用printf函数进行打印&#xff0c;本文主要介绍的是封装后的IO库函数。 标准库IO函数 常使用的IO库函数如下&#xff1a; 函数作用fop…

u盘系统文件删除后的五种恢复方法

U盘是我们日常生活中使用较为普遍的移动存储设备&#xff0c;由于其便携性和易用性广受人们的欢迎。然而&#xff0c;在我们使用U盘的过程中&#xff0c;经常会出现误删文件的情况&#xff0c;例如本来要作为启动盘的u盘&#xff0c;误删里面的系统文件怎么办&#xff1f;当U盘…

MySQL的同步数据Replication功能

MySQL提供了Replication功能&#xff0c;可以实现将一个数据库的数据同步到多台其他数据库。前者通常称之为主库&#xff08;master&#xff09;&#xff0c;后者则被称从库&#xff08;slave&#xff09;。MySQL复制过程采用异步方式&#xff0c;但延时非常小&#xff0c;秒级…

C51---超声波测距

1.主要实现功能&#xff1a;当手靠近传感器时&#xff0c;灯亮&#xff1b;手离开&#xff0c;灯灭 2.器件&#xff1a;51单片机、HC-SR04超声波测距传感器 3.代码&#xff1a; #include "reg52.h" //距离小于10cm&#xff0c;D5亮&#xff0c;D6灭&#xff0c;反之…

Lombok使用@Builder无法build父类属性

文章目录问题描述解决方案使用示例lombok Builder注解和build父类属性问题1、简介2.使用3、Builder注解对类做了什么&#xff1f;问题描述 实体类使用Lombok的Builder来实现Builder模式&#xff0c;但是如果使用了extend继承&#xff0c;则子类无法通过Builder来Build父类属性…

深度学习应用技巧4-模型融合:投票法、加权平均法、集成模型法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下&#xff0c;深度学习中的模型融合。它是将多个深度学习模型或其预测结果结合起来&#xff0c;以提高模型整体性能的一种技术。 深度学习中的模型融合技术&#xff0c;也叫做集成学习&#xff0c;是指同时使用多个…

CentOS7.5(1804)安装vsftpd(ftp)

1.准备安装包 1. vsftpd-3.0.2-29.el7_9.x86_64.rpm 2. ftp-0.17-67.el7.x86_64.rpm 可以自行下载,也可从我的博客中下载,下载传送门点 这里 2.安装vsftpd #1. 上传文件到服务器上,比如/home目录 #2. 执行以下命令安装 rpm -ivh vsftpd-3.0.2-29.el7_9.x86_64.rpm #3. 启动vsf…

极限的无穷小和无穷大

目录 无穷小&#xff1a; 无穷大&#xff1a; 无穷小&#xff1a; 举几个无穷小量的例子&#xff1a; 以0为极限的意思就是无穷小。 注&#xff1a;无穷小是变量&#xff0c;不能把很小很小的数混为一谈。 2&#xff1a;0是可以作为无穷小的唯一的一个数。 我们进行证明&…

完整教程:使用Spring Boot实现大文件断点续传及文件校验

一、简介 随着互联网的快速发展&#xff0c;大文件的传输成为了互联网应用的重要组成部分。然而&#xff0c;由于网络不稳定等因素的影响&#xff0c;大文件的传输经常会出现中断的情况&#xff0c;这时需要重新传输&#xff0c;导致传输效率低下。 为了解决这个问题&#xff…

【敏捷开发】jenkins「CI持续集成 CD持续部署」

文章目录前言一、安装jenkins1. 部署中的痛点2. 什么是jenkins3. jenkins的安装和配置&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装二、上传到运行服务器1. jenkins构建服务器流程2. 安装jenkins常用插件3. 通过freestyle构建项目4. 将构建服务器上的代码上传到…

ASA材料3D打印服务 抗紫外线材料3D打印服务 抗紫外线模型制作-CASAIM中科院广州电子

3D打印技术又称增材制造&#xff0c;通常是采用数字技术材料打印机来实现的&#xff0c;常在模具制造、工业设计等领域被用于制造模型&#xff0c;后逐渐用于一些产品的直接制造。随着 3D 打印逐渐成为主流生产流程的一部分&#xff0c;ASA抗紫外线材料应运而生。中科院广州电子…

Ubuntu 搭建NextCloud私有云盘【内网穿透远程访问】

文章目录1.前言2.本地软件安装2.1 nextcloud安装2.2 cpolar安装3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5. 结语1.前言 对于爱好折腾的电脑爱好者来说&#xff0c;Linux是绕不开的、必须认识的系统&#xff08;大部分服务器都是采用Linux操作系统&a…

华为OD机试题,用 Java 解【数组二叉树】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

将生成的NYUv2边界GT加载到dataloader中并进行训练

由上一篇我们可以知道&#xff0c;我们生成了一个label_img文件夹&#xff0c;里面存放的是索引对应图片的filename&#xff0c;每个filename里面存放的是GT的40个通道的边缘GT。train里面是这样&#xff0c;test里面也是这样。 加载数据我们要到train文件的dataloader中&…

Azure AD 与 AWS 单一帐户SSO访问集成,超详细讲解,包括解决可能出现的错误问题

本教程介绍如何将 AWS Single-Account Access 与 Azure Active Directory (Azure AD) 相集成。 将 AWS Single-Account Access 与 Azure AD 集成后&#xff0c;可以&#xff1a; 在 Azure AD 中控制谁有权访问 AWS Single-Account Access。让用户使用其 Azure AD 帐户自动登录…

SwiftUI 常用组件和属性(SwiftUI初学笔记)

本文为初学SwiftUI笔记。记录SwiftUI常用的组件和属性。 组件 共有属性(View的属性) Image("toRight").resizable().background(.red) // 背景色.shadow(color: .black, radius: 2, x: 9, y: 15) //阴影.frame(width: 30, height: 30) // 宽高 可以只设置宽或者高.…