手动搭建一个简单的MVVMLight框架的方法

news2024/12/22 23:55:46

本章讲述:手动搭建一个简单的MVVMLight框架步骤:

1、下载MVVMLight所需要的dll库文件

    主要文件包括:CommonServiceLocator.dll、GalaSoft.MvvmLight.dll、GalaSoft.MvvmLight.Extras.dll、GalaSoft.MvvmLight.Platform.dll、System.Windows.Interactivity.dll

    下载地址:

2、新建项目,项目名称为:“DSViewerTooling”,在项目中引用下载的dll库文件,新建文件夹“Model”、“View”和“ViewModel”;

3、添加类文件“MainViewModel”   

    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Command;
    using GalaSoft.MvvmLight.Messaging;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace DSViewerTooling.ViewModel
    {
        public class MainViewModel : ViewModelBase
        {

        }
    }

4、添加类文件“ViewModelLocator”

    using CommonServiceLocator;
    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Ioc;
    namespace DSViewerTooling.ViewModel
    {
        public class ViewModelLocator
        {
            /// <summary>
            /// Initializes a new instance of the ViewModelLocator class.
            /// </summary>
            public ViewModelLocator()
            {
                ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
                SimpleIoc.Default.Register<MainViewModel>();
            }

            public MainViewModel Main
            {
                get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
            }            

            public static void Cleanup()
            {
                // TODO Clear the ViewModels
            }
        }
    }

项目文件结构图:

5、修改“App.xaml”文件

<Application x:Class="DSViewerTooling.App"
             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"
             d1p1:Ignorable="d"
             xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:DSViewerTooling.ViewModel" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

首先View和ViewModel之间不再直接引用,而是通过ViewModelLocator关联,

其次储存在ViewModelLocator里的ViewModel类似于单例的存在,可以在全局引用绑定。

同时避免了某些情况下频繁创建ViewModel,却未做好资源释放造成的内存泄漏。(这里并不是说所有的ViewModel都必须放到ViewModelLocator)

下面我们来看下Command是如何绑定的,通知PropertyChanged以及ViewModelBase类 。

MvvmLight的ViewModelBase很有意思,继承了INotifyPropertyChanged接口,并提供了一个Set方法来给属性赋值,简单理解就是不用自己在ViewModel实现INotifyPropertyChanged,然后在属性赋值时通知了。

6、绑定MainWindow.xaml到ViewModelLocator中的Main

<Window x:Class="DSViewerTooling.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding Main ,Source={StaticResource Locator}}">
    <StackPanel VerticalAlignment="Center">
        <TextBlock Text="{Binding Title}" FontFamily="微软雅黑" Foreground="Black" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <Button Margin="30" Width="80" Height="35" Content="改变文本" Command="{Binding ChangeTitleCmd}"/>
    </StackPanel>
</Window>

7、属性和ICommand定义声明,在MainViewModel.cs

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

namespace DSViewerTooling.ViewModel
{

    public class MainViewModel : ViewModelBase
    {
        private string title = "Hello MVVMLight,Hello C#";
        public string Title
        {
            get { return title; }
            set { title = value; RaisePropertyChanged(); }
        }
        #region        
        private ICommand m_ChangeTitleCmd;
        public ICommand ChangeTitleCmd
        {
            get
            {
                return m_ChangeTitleCmd ?? (m_ChangeTitleCmd = new RelayCommand(() =>
                {
                    Title = "chanage title command";
                }));
            }
        }
        #endregion
    }
}

8、运行结果图,右图为点击按钮改变文本框显示ICommand 命令响应;

     

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

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

相关文章

小兔新--项目实战总结1

目录 Layout-吸顶导航交互实现 吸顶交互 vueUse Layout-Pinia优化重复请求 为什么要优化 如何优化 Home-懒加载指令优化 场景和指令用法 实现思路和步骤 回顾核心步骤代码 Home-懒加载指令优化 问题1:逻辑书写位置不合理 问题2:重复监听问题 一级分类-解决路由缓存问…

Web基本与HTTP协议

目录 一&#xff1a;域名 1.域名概述 2.域名空间结构 3. 域名注册 二&#xff1a; 网页访问&#xff08;HTTP/HTTPS&#xff09; 1.网页的基本概念 2.网站 3.主页 4.域名 5.HTTP 6.URL 7.网页基本标签 &#xff08;1&#xff09;网页摘要信息的作用 &#xff08;…

Oracle SQLTUNING优化SQL

通过AWR的TOPSQL观察到sqlid为6pk9xfmjd0s8j的sql语句耗时1分钟。 通过ash观察到&#xff0c;该SQL由于全表扫描占用了大量的IO资源。 解析执行计划&#xff0c;看到是MED_SALE_ORDER表做了全表扫描。 该表有678W条记录&#xff0c;全表扫描必定IO指标会冲高&#xff0c;影…

SFM过程(一)

以图像为基础的三维重建过程SFM基本如下图所示&#xff1a; 以SfM-Toy-Library代码为例&#xff0c;如下&#xff1a; ErrorCode SfM::runSfM() {if (mImages.size() < 0) {cerr << "No images to work on." << endl;return ErrorCode::ERROR;}//in…

Java-网络原理

目录 一、网络互连 局域网LAN 广域网WAN 二、网络通信基础 IP地址 端口号 认识协议 三、五元组 四、协议分层 五、OSI七层模型 六、TCP/IP五层&#xff08;或四层&#xff09;模型 网络分层对应 七、封装和分用 一、网络互连 随着时代的发展&#xff0c;越来越需要计…

Smartbi电子表格故事之用数据进行销售问题分析

天津小麦商贸有限公司&#xff08;X&M&#xff09;成立于2012年11月&#xff0c;主营业务是商贸流通业&#xff0c;主要是日用商品的批发销售。 2012年前&#xff0c;公司创始人&#xff08;总经理和销售总监&#xff09;一直从事外贸的生意&#xff0c;自从2008年金融危机…

java 课程信息管理系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 课程信息管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…

Scrum的执行过程及产品Backlog梳理的目的、时间、内容

Scrum的迭代运行过程 产品Backlog梳理 目的&#xff1a; •对下个Sprint的需求进行需求细节梳理和精化&#xff0c;识别技术风险和依赖&#xff0c;完成估算和优先级排序。 时间&#xff1a; •本Sprint开始后第6天&#xff0c;2小时以内 。 内容&#xff1a; •理解需求…

2020下半年

2020下半年 d a b 小阶向大阶对齐 b b 平均cpi: MIPS: d c 公加验&#xff0c;私解签 加密防止被动攻击&#xff0c;认证防止主动攻击 a 访问控制包括&#xff1a;授权&#xff0c;确定存取权限&#xff0c;实施存取权限 c a c a 先申请先得 b b 著作权包括&…

论文分享 | WSBERT:Weighted Sampling for Masked Language Modeling

本次分享阿里巴巴达摩院语音实验室、新南威尔士大学与香港科技大学&#xff08;广州&#xff09;等在ICASSP2023会议发表的论文《Weighted Sampling for Masked Language Modeling》。该论文主要提出了两种简单有效的加权采样策略&#xff0c;来缓解掩码语言模型&#xff08;ML…

七、数据仓库详细介绍(调度)

0x00 前言 在之前的文章&#xff0c;我们规划了数仓架构&#xff0c;制定了数仓规范&#xff0c;然后在架构和规范的指导下设计了存储模型、构建了 ETL 系统。 数仓模型解决了数据存储问题&#xff0c;ETL 解决了数据同步集成计算问题&#xff0c;而调度解决的是自动化问题。 …

【音视频】音视频自研对比

WVP(自研视频调度平台&#xff09;CM8播放器&#xff08;前端&#xff09;传输协议&#xff1a;websocket 编码协议&#xff1a;ts 语言&#xff1a;TS传输协议&#xff1a;websocket 编码协议&#xff1a;fmp4、mse 语言&#xff1a;JS框架&#xff1a;jessibuca 性质&#xf…

TCP和UDP

文章目录 1、常见误区2、TCP和UDP的区别和应用场景3、使用了它们的协议有哪些&#xff1f;4、总结 我之前的文章中讲解即时通讯系统中&#xff0c;就用到了可靠传输协议TCP&#xff0c;在那里面我们解决了TCP传输中的半包和黏包&#xff0c;而且还实际的讨论了用了TCP&#xff…

免费开源 | 基于SpringBoot的学生信息管理系统

一、项目简介 学生信息管理后台&#xff0c;包括学生管理、课程管理、成绩管理&#xff0c;适用于课设等&#xff0c;仅具有管理功能&#xff0c;感兴趣的伙伴可以再次完善。 二、软件架构 springboot mybatis thymeleaf 三、系统运行 注&#xff1a;mysql数据库要8.0以上…

【老王读SpringMVC-6】Controller method 的正常返回值处理

handler method 的返回值处理包含两个方面&#xff1a; 一是&#xff1a;返回值对象的处理&#xff1b; 二是&#xff1a;视图的渲染。 返回值对象的处理 通过前面的分析&#xff0c;我们知道&#xff0c; 被 RequestMapping 标记 handler method 的执行是通过调用 RequestMa…

Java的反射

1.反射的定义 Java反射是Java被视为动态&#xff08;或准动态&#xff09;语言的一个关键性质。JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&a…

react学习3 生命周期

componentDidMount()与render()一个级别的&#xff0c;在组件挂载完成之后调用 卸载组件&#xff1a;REACTDOM.unmountComponentAtNode() componentWillUnmount() 组件马上被卸载的时候 老生命周期&#xff1a; 新的生命周期&#xff1a; 废弃了&#xff08;加上Unsate_还是…

Python3安装pyhanlp最佳解决方法

1、Hanlp介绍 Hanlp是一款中文自然语言处理工具。Hanlp支持多种自然语言处理任务&#xff0c;包括分词、词性标注、命名实体识别、依存句法分析、情感分析、文本分类等。其主要优点包括&#xff1a; 高准确率&#xff1a;Hanlp采用了基于神经网络的分词方法&#xff0c;有效提…

关于字符集

字符集 编码与解码 计算机中储存的信息都是用二进制数表示的&#xff0c;而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则&#xff0c;将字符存储到计算机中&#xff0c;称为编码 。反之&#xff0c;将存储在计算机中的二进制数…

【老王读SpringMVC-7】Controller method 的异常返回值处理

通过前面分析 Controller method的执行过程&#xff0c;我们知道&#xff0c; handler method 的执行是通过调用 ServletInvocableHandlerMethod#invokeAndHandle()。 执行过程中的异常全部会往上抛出&#xff0c;然后由 DispatcherServlet 来处理。 DispatcherServlet 会调用 …