IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 【WPF】MVVMLight -> 正文阅读

[开发测试]【WPF】MVVMLight

一、MVVM介绍

? ? ? MVVM(Model-View-ViewModel)—— 类似于MVC、MVP的设计模式(非框架级别),由MVP(Model-View-Presenter)模式与WPF结合的应用方式发展演变过来的一种新型架构。主要目的是分离视图(View)和模型(Model)的耦合。

1、结构:

?2、优点:

(1)低耦合:视图(View)独立于Model的变化,一个ViewModel可以绑定到不同的View上。View变化时Model可以不变,Model变化时View可以不变。

(2)可重用性:可以把不同视图逻辑放到一个ViewModel里,让多个View重用这段视图逻辑。

(3)独立开发:开发人员可以专注于业务逻辑和数据的开发,设计人员可以专注于页面设计。

(4)可测试:(不懂)

参考:https://www.cnblogs.com/wzh2010/p/6285954.html

二、MVVMLight框架

1、安装

? ? ? ?方式一:去官网上下载MVVMLight Toolkit,安装后,VS模板中会出现MvvmLight项目模板,可以直接使用该项目模板来创建项目,项目里面会包含默认的ViewModelLocator和MainViewModel。

???????方式二:NuGet安装。在NuGet 工具箱上搜索 MVVM Light,可以看到两个项目,一个是MVVM Light , 一个是 MVVM Light libraries only。两个项目的区别是MVVMLight 除了必要的GalaSoft 组件之外,还会额外添加相关分层文件目录,形成简单的MVVMLight成型框架,帮助生成ViewModel文件夹,里面包含MainViewModel和ViewModelLocator文件。

2、ViewModel文件夹

MainViewModel.cs? ? //自动为主窗口生成的viewmodel,可以删除,然后自定义。

ViewModelLocator.cs? ?//视图模型注入器,用来联系View相对应的viewmodel

   <Application.Resources>
        <ResourceDictionary>
            <!--自动添加ViewModelLocator作为全局资源来修改App.xaml文件。(需要重新编译)-->
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:MiniPrinter.ViewModel" />
        </ResourceDictionary>
    </Application.Resources>

?每次APP初始化时都会初始化ViewModelLocator。

在构造器中把使用到的ViewModel统一注册,并生成单一实例。

然后使用属性把它暴露出来,每当访问属性的时候,就会返回相应的ViewModel实例。

    public class ViewModelLocator
    {
        /// <summary>
        /// Initializes a new instance of the ViewModelLocator class.
        /// </summary>
        public ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
           
            SimpleIoc.Default.Register<MainViewModel>();
            SimpleIoc.Default.Register<EditPrintItemWindowViewModel>();
        }

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

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

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

使用ViewModelLocator后,View和ViewModel之间不再直接引用,而是通过ViewModelLocator关联。储存在ViewModelLocator里的ViewModel类似于单例的存在,可以在全局引用绑定。同时避免了某些情况下频繁创建ViewModel,却未做好资源释放造成的内存泄漏。

3、使用

(1)直接在项目上增加;

(2)如果有新的界面与新的viewmodel,则需要在ViewModelLocator中注册写好的ViewModel。

(3)Model中,对应的字段属性需要有通知事件,在对应的ViewModel定义的集合或者字段也需要有通知事件。

public class EditPrintItemWindowViewModel : ViewModelBase
{
    private PrintItem printItem = new PrintItem();
    /// <summary>
    /// 打印项
    /// </summary>
    public PrintItem PrintItem
    {
        get { return printItem; }
        set { printItem = value;RaisePropertyChanged("PrintItem"); }
    }
 } 

(4)绑定:前端或后台

前端:在<Window>标签中增加 ?DataContext="{Binding Source={StaticResource Locator},Path=注册的自定义实例}"

<mah:MetroWindow x:Class="MiniPrinter.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:MiniPrinter"
                xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" 
                xmlns:controls="clr-namespace:MiniPrinter.Controls"
                mc:Ignorable="d"
                DataContext="{Binding Source={StaticResource Locator},Path=Main}"
</mah:MetroWindow>

后台:在对应的.cs的构造函数中增加 ?this.DataContext = new 自定义的ViewModel();

public MainWindow()
{
     InitializeComponent();
     this.DataContext=new MainViewModel;
}         

参考:https://blog.csdn.net/qq_43307934/article/details/91044172?

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:38:55  更:2021-08-28 09:38:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 22:47:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码