首页 > 其他分享 >WPF MVVM模式简介

WPF MVVM模式简介

时间:2023-04-07 10:26:00浏览次数:58  
标签:Model MVVM get 简介 ViewModel WPF public View

WPF是Windows Presentation Foundation的缩写,它是一种用于创建桌面应用程序的用户界面框架。WPF支持多种开发模式,其中一种叫做MVVM(Model-View-ViewModel)。

什么是MVVM?

MVVM是一种软件架构模式,它将应用程序分为三个层次:Model(模型),View(视图)和ViewModel(视图模型)。Model表示应用程序的数据和业务逻辑,View表示应用程序的用户界面,ViewModel表示View和Model之间的桥梁,它负责处理View的数据绑定和用户交互。

为什么要使用MVVM?

使用MVVM有以下几个好处:

  • 降低了View和Model之间的耦合度,使得它们可以独立地开发和测试。
  • 提高了代码的可重用性和可维护性,因为ViewModel可以在不同的View之间共享。
  • 简化了单元测试,因为ViewModel不依赖于具体的UI控件。
  • 支持双向数据绑定,使得View可以自动更新Model的变化,反之亦然。
  • 利用了WPF提供的强大特性,如命令、依赖属性、数据注解等。

下图我们可以直观的理解MVVM谁急模式:

Alt text

View: 使用XAML呈现给用户的界面,负责与用户交互,接收用户输入,把数据展现给用户。

Model: 事物的抽象,开发过程中涉及到的事物都可以抽象为Model,例如姓名、年龄、性别、地址等属性.不包含方法,也不需要实现INotifyPropertyChanged接口.

ViewModel: 负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View。同时也可以处理一些UI逻辑。

如何实现MVVM?

实现MVVM需要遵循以下几个步骤:

  1. 创建一个Model类,定义应用程序所需的数据和业务逻辑。
  2. 创建一个ViewModel类,继承自INotifyPropertyChanged接口,并实现属性变更通知。在ViewModel中定义与Model相关联的属性,并提供相应的命令来执行用户操作。
  3. 创建一个View类(通常是一个XAML文件),定义应用程序的用户界面。在View中使用数据绑定来连接ViewModel中的属性和命令,并设置相关的样式和行为。
  4. 在App.xaml或其他合适的地方创建一个ViewModel实例,并将其作为View中DataContext属性值。
  5. 示例代码:
// Model class
public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// ViewModel class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows;

namespace WpfApp1
{
    public class UserInfoViewModel : INotifyPropertyChanged
    {
        private User user;

        public UserInfoViewModel()
        {
            user = new User();
            SaveCommand = new RelayCommand(Save);
            CancelCommand = new RelayCommand(Cancel);
        }

        public string UserName
        {
            get { return user.Name; }
            set
            {
                user.Name = value;
                OnPropertyChanged("UserName");
            }
        }

        public int UserAge
        {
            get { return user.Age; }
            set
            {
                user.Age = value;
                OnPropertyChanged("UserAge");
            }
        }

        public string UserInfo
        {
            get { return $"Name:{UserName} Age:{UserAge}"; }
        }

        public ICommand SaveCommand { get; private set; }
        public ICommand CancelCommand { get; private set; }

        private void Save(object parameter)
        {
            // Save user data to database or service
            MessageBox.Show("User data saved!");

            OnPropertyChanged("UserInfo");
        }

        private void Cancel(object parameter)
        {
            // Close dialog window without saving data
            var window = parameter as Window;
            if (window != null)
                window.Close();

        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

//Command class
public class RelayCommand : ICommand
{
    public RelayCommand(Action<object> action)
    {
        DoExecute = action;
    }

    public event EventHandler? CanExecuteChanged;
    public Func<object, bool>? CanExecution { set; get; }
    public Action<object>? DoExecute { set; get; }

    public bool CanExecute(object? parameter)
    {
        if (CanExecution != null)
        {
            CanExecute(parameter);
        }
        return true;
    }

    public void Execute(object? parameter)
    {
        DoExecute!.Invoke(parameter!);
    }
}
// View class (XAML file)

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="220" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- Labels and textboxes for user name and age -->

        <Label Content="Name:" Grid.Row="0" Grid.Column="0" Margin="10"/>
        <TextBox Text="{Binding UserName}" Grid.Row="0" Grid.Column="1" Margin="10"/>

        <Label Content="Age:" Grid.Row="1" Grid.Column="0" Margin="10"/>
        <TextBox Text="{Binding UserAge}" Grid.Row="1" Grid.Column="1" Margin="10"/>

        <Label Content="{Binding UserInfo}" Grid.Row="2" Grid.Column="1" Margin="10"/>
        <!-- Buttons for save and cancel commands -->

        <StackPanel Orientation= "Horizontal" HorizontalAlignment= "Right"
                    Grid.Row= "3" Grid.ColumnSpan= "2">
            <Button Content= "Save" Command="{Binding SaveCommand}"
                    CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,
                  AncestorType={x:Type Window}}}" Margin= "10"/>
            <Button Content= "Cancel" Command="{Binding CancelCommand}"
                    CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,
                  AncestorType={x:Type Window}}}" Margin= "10"/>
        </StackPanel>

    </Grid>
</Window>
// View code-behind file

using System.Windows;

namespace WpfApp1
{
   /// Interaction logic for UserInfoView.xaml
   
   public partial class MainWindow : Window
   {
      public MainWindow()
      {
         InitializeComponent();

         // Set the ViewModel as the DataContext of the View

         this.DataContext = new UserInfoViewModel();
      }
   }
}

运行结果如下:
Alt text

代码位置:
https://github.com/DXG88/WpfApp1.git

有哪些MVVM框架?

虽然可以手动实现MVVM模式,但是也有许多第三方库提供了更方便和高效地使用MVVM模式。以下是一些常见且流行的MVVM框架:

  • Prism: 一个由微软支持的MVVM框架,提供了一系列服务和特性,如导航、模块化、事件聚合、命令、依赖注入等。
  • MVVM Light: 一个轻量级的MVVM框架,提供了一些基础类和组件,如ViewModelBase, RelayCommand, Messenger等。
  • Caliburn.Micro: 一个基于约定而非配置的MVVM框架,提供了一些高级特性,如屏幕激活/关闭生命周期管理、自动绑定、窗口管理器等。

作者:百宝门-董校刚

原文地址:https://blog.baibaomen.com/wpf-mvvm模式简介/

标签:Model,MVVM,get,简介,ViewModel,WPF,public,View
From: https://www.cnblogs.com/baibaomen-org/p/17295125.html

相关文章

  • ERP MES 两套系统源代码 WPF AGV C# WPF开发
    ERPMES两套系统源代码WPFAGVC#WPF开发。A,WPFMES上位机产线执行系统。1,完整纯源代码;2,AGV自动调度;3,SQLSERVER数据库。带附加文件。4,WPF各种技术应用。5,数据库技术应用。6,DTU数据传输。7,TCPIPSOCKET技术应用。8,EXCEL数据查询与导出。9,各种库位的管理。......
  • 计算机的一些操作及简介
    什么是计算机Computer:全称电子计算机,俗称电脑。能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。由硬件和软件所组成常见的形式有台式计算机、笔记本计算机、大型计算机等。广泛应用在:科学计算,数据处理,自动控制,计算机辅助设计,人工智能,网络等领域 硬件及冯......
  • WPF的控件字符串内容使用StringFormat进行字符串转换
    在WPF中TextBlock的Text有时内容只需要改变个别数字,而不需要所以内容都修改,这时候就要使用StringFormat, 如:<TextBlockText="Ihavexxxfriends"/>这里面的xxx是个变量,那在Binding时应该怎样写呢<TextBlockText="{BindingFirendNumber,StringFormat='Ihave{0}firends......
  • GO框架 - gin简介
    Gin是一个用Go(Golang)编写的web框架。它是一个类似于martini但拥有更好性能的API框架,由于httprouter,速度提高了近40倍。如果你是性能和高效的追求者,你会爱上Gin.快速:基于Radix树的路由,小内存占用。没有反射。可预测的API性能。支持中间件:传入的HTTP请......
  • GO框架 - beego简介
    bee工具是一个为了协助快速开发beego项目而创建的项目,通过bee您可以很容易的进行beego项目的创建、热编译、开发、测试、和部署。简单化:RESTful支持、MVC模型,可以使用bee工具快速地开发应用,包括监控代码修改进行热编译、自动化测试代码以及自动化打包部署。智能化:支......
  • GO框架 - iris简介
    专注于高性能简单流畅的API高扩展性强大的路由和中间件生态系统使用iris独特的表达主义路径解释器构建RESTfulAPI动态路径参数化或通配符路由与静态路由不冲突使用重定向选项从URL中删除尾部斜杠使用虚拟主机和子域名变得容易分组API和静态或甚至动态子域名net/http......
  • VM安装虚拟机时各分区,设备类型,文件系统简介
    各分区简介:/boot:存放开机文件,一般为100M左右(50M~200M)。swap:swap是交换分区、可以看成一种虚拟的内存扩展,内存不够是,可以将内存程序移入,需要时再取出,会比从硬盘读取快。/:linux根目录的分区。各设备类型简介:标准分区:标准分区可以包含文件系统或交换空间,也能提供一个容器,用于......
  • 探测工具nmap简介及使用说明
    1.前言:当我们在构建环境或排查问题时,常常是先确定环境是否正常,首要确定的就是当前ip是否可用,或是是否在使用,将要使用的端口是否已配置等进行,除了我们常用的ping或是telnet工具外,还有别一种工具nmap,可以说是扫描神器。接下来就让我简单的给大家介绍一下nmap吧。2.nmap简介:本人使用......
  • 15CrMo合金钢、15CrMo钢板简介、15CrMo期货订轧
    一、15CrMo钢板简介:15CrMo合金钢板系珠光体组织耐热钢,在高温下具有较高的热强性(δb≥440MPa)和抗氧化性,并具有一定的抗氢腐蚀能力。由于钢中含有较高含量的Cr、C和其它合金元素,钢材的淬硬倾向较明显,焊接性差。15CrMo钢板执行标准为:舞技二、15CrMo钢板化学成分:CMnSiCrMoNiSP0.12~0.......
  • 谈谈你对MVVM的理解?
    MVVM即Model、View、ViewModelModel数据层负责数据的定义以及业务逻辑等操作,对应到Vue组件中就是script部分而View则可以理解为我们打开浏览器所看到的页面,对应到Vue组件中就是templateViewModel可以理解为一个衔接Model和View之间的桥梁,主要功能就是实现Model和View之间的同步......