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#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服