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

星杰吖_6287

星杰吖_6287

2025-11-06

1013人浏览

原创

答案:本文介绍了在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;
<p>public class MainViewModel : INotifyPropertyChanged
{
private string _name;
private int _age;</p><pre class="brush:php;toolbar:false;">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
<window x:class="MvvmApp.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" title="MVVM 示例" height="200" width="300"><stackpanel margin="20"><textblock text="姓名:"></textblock><textbox text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"></textbox><textblock text="年龄:" margin="0,10,0,0"></textblock><textbox text="{Binding Age, UpdateSourceTrigger=PropertyChanged}"></textbox></stackpanel></window>

在窗口加载时设置 DataContext:

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

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

使用 ICommand 处理用户操作

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

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

Microsoft To Do
Microsoft To Do

通过 `todo` CLI 管理 Microsoft To Do 任务,支持添加、列出、完成、删除任务,管理子任务、笔记及整理任务列表。

下载
using System.Windows.Input;
<p>public class MainViewModel : INotifyPropertyChanged
{
// ... 其他属性</p><pre class="brush:php;toolbar:false;">public ICommand SaveCommand => new RelayCommand(Save);

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

// 实现 INotifyPropertyChanged ...

}

需要定义一个简单的 RelayCommand:

Commands/RelayCommand.cs
using System;
using System.Windows.Input;
<p>public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;</bool></p><pre class="brush:php;toolbar:false;">public RelayCommand(Action execute, Func<bool> 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; }
}</bool>

}

在 XAML 中绑定命令:

<button content="保存" command="{Binding SaveCommand}" margin="0,10"></button>

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

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

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

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

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

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

windows microsoft c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.10.19

3028

3

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

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

2025.10.17

4149

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3649

9

java接口相关教程
java接口相关教程

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

2026.01.19

346

15

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

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

2023.10.30

1162

5

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

0

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

160

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

热门下载

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

精品课程

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