0

0

C# 如何在 WPF 中使用 MVVM 模式_C# WPF MVVM 模式应用教程

幻夢星雲

幻夢星雲

发布时间:2025-11-06 08:11:34

|

953人浏览过

|

来源于php中文网

原创

答案:本文介绍了在WPF中通过MVVM模式实现界面与业务逻辑分离的方法,包括创建Models、ViewModels和Views三层结构,使用INotifyPropertyChanged接口实现数据绑定,通过RelayCommand处理用户命令,并在XAML中绑定DataContext与ICommand,从而实现解耦和可维护的代码架构。

c# 如何在 wpf 中使用 mvvm 模式_c# wpf mvvm 模式应用教程

在 WPF 中使用 MVVM(Model-View-ViewModel)模式,可以让界面与业务逻辑清晰分离,提升代码的可维护性和可测试性。下面介绍如何在 C# WPF 项目中实现 MVVM 模式,从结构搭建到数据绑定和命令处理。

创建基本项目结构

新建一个 WPF 应用程序后,建议按功能划分文件夹,使结构更清晰:

  • Views:存放 XAML 界面文件(如 MainWindow.xaml、UserControl 等)
  • ViewModels:存放 ViewModel 类,负责提供 View 所需的数据和命令
  • Models:存放数据模型,表示业务实体

例如,创建一个简单的用户信息展示功能:

Models/User.cs
public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

ViewModels/MainViewModel.cs

using System.ComponentModel;

public class MainViewModel : INotifyPropertyChanged { private string _name; private int _age;

public string Name
{
    get => _name;
    set
    {
        _name = value;
        OnPropertyChanged(nameof(Name));
    }
}

public int Age
{
    get => _age;
    set
    {
        _age = value;
        OnPropertyChanged(nameof(Age));
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

}

设置数据绑定

在 View 中绑定 ViewModel 的属性,让界面自动响应数据变化。

Views/MainWindow.xaml

    
        
        
        
        
    

在窗口加载时设置 DataContext:

MainWindow.xaml.cs
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
}

这样,文本框会自动显示 ViewModel 中的值,并在用户输入时更新属性。

使用 ICommand 处理用户操作

ViewModel 不应直接引用 UI 元素,通过 ICommand 实现按钮点击等交互。

添加一个“保存”命令到 ViewModel:

Sapling AI Content Detector
Sapling AI Content Detector

Sapling.ai推出的免费在线AI内容检测工具

下载
using System.Windows.Input;

public class MainViewModel : INotifyPropertyChanged { // ... 其他属性

public ICommand SaveCommand => new RelayCommand(Save);

private void Save()
{
    MessageBox.Show($"保存用户:{Name}, 年龄:{Age}");
}

// 实现 INotifyPropertyChanged ...

}

需要定义一个简单的 RelayCommand:

Commands/RelayCommand.cs
using System;
using System.Windows.Input;

public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func _canExecute;

public RelayCommand(Action execute, Func canExecute = null)
{
    _execute = execute;
    _canExecute = canExecute;
}

public bool CanExecute(object parameter) => _canExecute == null || _canExecute();

public void Execute(object parameter) => _execute();

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

}

在 XAML 中绑定命令:

点击按钮时会调用 ViewModel 中的 Save 方法,完全解耦 UI 和逻辑。

整合资源与导航(可选进阶)

大型应用中,可以使用 ViewModelLocator 或依赖注入容器(如 Microsoft.Extensions.DependencyInjection)统一管理 ViewModel 创建。

也可以通过 Messenger 或事件聚合器实现跨 ViewModel 通信,避免紧耦合。

基本上就这些。掌握属性通知、数据绑定和命令机制,就能在 WPF 中有效使用 MVVM 模式。不复杂但容易忽略细节,比如忘记设置 DataContext 或未正确触发 PropertyChanged。多练习几个小功能,很快就能上手。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

980

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

36

2025.10.17

vsd文件打开方法
vsd文件打开方法

vsd文件打开方法有使用Microsoft Visio软件、使用Microsoft Visio查看器、转换为其他格式等。想了解更多vsd文件相关内容,可以阅读本专题下面的文章。

461

2023.10.30

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

0

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

2

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 5.9万人学习

Excel 教程
Excel 教程

共162课时 | 9.4万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号