C# WPF入门学习主线篇(三十一)—— MVVM模式简介

2024-06-14 17:36

本文主要是介绍C# WPF入门学习主线篇(三十一)—— MVVM模式简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C# WPF入门学习主线篇(三十一)—— MVVM模式简介

在这里插入图片描述

MVVM(Model-View-ViewModel)模式是WPF开发中的一种重要架构模式。它通过将用户界面(View)与业务逻辑和数据(Model)分离,提高了代码的可维护性和可测试性。本文将详细介绍MVVM模式的基本概念、组件及其交互方式。

一、MVVM模式的基本概念

1. Model

Model表示应用程序的核心数据和业务逻辑。它通常包含数据结构、业务规则和数据访问代码。Model不依赖于UI,是独立且可重用的组件。例如,在一个员工管理系统中,Model可以表示员工的实体类:

public class Employee
{public string Name { get; set; }public int Age { get; set; }public string Position { get; set; }
}

2. View

View表示用户界面,负责显示数据和接收用户输入。View通过数据绑定和命令与ViewModel交互,而不直接访问Model。View通常是XAML文件及其相关的代码隐藏文件。

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MVVM Demo" Height="200" Width="300"><Grid><StackPanel><TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/><TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/><TextBox Text="{Binding Position, UpdateSourceTrigger=PropertyChanged}" FontSize="16" Margin="10"/></StackPanel></Grid>
</Window>

3. ViewModel

ViewModel是View和Model之间的桥梁。它负责从Model获取数据,并将这些数据提供给View,同时处理用户在View上的交互。ViewModel通常实现通知机制(如INotifyPropertyChanged接口),以便在数据变化时通知View进行更新。

using System.ComponentModel;public class EmployeeViewModel : INotifyPropertyChanged
{private Employee _employee;public EmployeeViewModel(){_employee = new Employee { Name = "John Doe", Age = 30, Position = "Software Developer" };}public string Name{get => _employee.Name;set{if (_employee.Name != value){_employee.Name = value;OnPropertyChanged(nameof(Name));}}}public int Age{get => _employee.Age;set{if (_employee.Age != value){_employee.Age = value;OnPropertyChanged(nameof(Age));}}}public string Position{get => _employee.Position;set{if (_employee.Position != value){_employee.Position = value;OnPropertyChanged(nameof(Position));}}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

4. 绑定ViewModel到View

在View的代码隐藏文件中,我们将ViewModel实例绑定到View的DataContext。

using System.Windows;namespace WpfApp
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.DataContext = new EmployeeViewModel();}}
}

二、MVVM模式的优点

1. 提高代码的可维护性

通过将UI和业务逻辑分离,MVVM模式使得代码更加清晰,易于维护和修改。

2. 提高代码的可测试性

业务逻辑集中在ViewModel中,可以方便地进行单元测试,而不依赖于UI。

3. 提高代码的可重用性

Model和ViewModel是独立于UI的,可以在不同的应用程序中重用。

4. 支持设计和开发的分离

开发人员可以专注于ViewModel和Model的开发,而设计人员可以独立于开发人员设计UI。

三、MVVM模式的实现细节

1. 数据绑定

数据绑定是MVVM模式的核心。通过数据绑定,View可以自动从ViewModel中获取数据并显示在UI上。

2. 通知机制

通知机制(如INotifyPropertyChanged接口)使得ViewModel可以在数据变化时通知View更新UI。

3. 命令绑定

命令绑定使得ViewModel可以处理用户在View上的交互,而不需要在View中编写处理逻辑。

using System;
using System.Windows.Input;public class RelayCommand : ICommand
{private readonly Action<object> _execute;private readonly Func<object, bool> _canExecute;public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null){_execute = execute;_canExecute = canExecute;}public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);public void Execute(object parameter) => _execute(parameter);public event EventHandler CanExecuteChanged{add => CommandManager.RequerySuggested += value;remove => CommandManager.RequerySuggested -= value;}
}

在ViewModel中使用命令:

public class EmployeeViewModel : INotifyPropertyChanged
{private Employee _employee;public EmployeeViewModel(){_employee = new Employee { Name = "John Doe", Age = 30, Position = "Software Developer" };UpdateCommand = new RelayCommand(UpdateEmployee);}public string Name{get => _employee.Name;set{if (_employee.Name != value){_employee.Name = value;OnPropertyChanged(nameof(Name));}}}public int Age{get => _employee.Age;set{if (_employee.Age != value){_employee.Age = value;OnPropertyChanged(nameof(Age));}}}public string Position{get => _employee.Position;set{if (_employee.Position != value){_employee.Position = value;OnPropertyChanged(nameof(Position));}}}public ICommand UpdateCommand { get; }private void UpdateEmployee(object parameter){Name = "Updated Name";Age = 35;Position = "Updated Position";}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

在View中绑定命令:

<Button Content="Update" Command="{Binding UpdateCommand}" FontSize="16" Margin="10"/>

四、总结

MVVM模式是WPF开发中的一种重要架构模式,通过将用户界面(View)与业务逻辑和数据(Model)分离,提高了代码的可维护性和可测试性。本文介绍了MVVM模式的基本概念、组件及其交互方式,并通过一个简单的示例演示了如何在WPF应用程序中实现MVVM模式。

通过MVVM模式,我们可以提高WPF应用程序的开发效率和代码质量,使得应用程序更加易于维护和扩展。希望本文能帮助你更好地理解和应用MVVM模式,提高WPF开发的水平。

这篇关于C# WPF入门学习主线篇(三十一)—— MVVM模式简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061065

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.