WPF MVVM模式介绍

WPF (Windows Presentation Foundation)是.NET Framework的一部分,它提供了一种用于构建丰富的Windows桌面应用程序的方式。MVVM (Model-View-ViewModel) 是一种特定于UI的设计模式,它利用强大的数据绑定特性,是WPF和其它XAML基础的开发框架的首选设计模式。

MVVM模式将应用程序分为三个部分:

  1. Model(模型):模型代表的是数据和业务逻辑。它包括业务规则、数据访问、模型类等。
  2. View(视图):视图是用户看到和与之交互的界面。在WPF中,它通常是XAML文件。
  3. ViewModel(视图模型):ViewModel是视图的抽象,它包含视图中显示的状态和命令。换句话说,它是视图的功能性模型,并且是View和Model之间的连接器或者说适配器。

MVVM的主要优点是分离视图和模型,这样就可以使每个部分独立进行开发、测试和修改,同时还能保证UI和业务逻辑的同步。

下面是一个简单的WPF MVVM模式的代码示例:

Model(Person.cs):

csharp 复制代码
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

ViewModel(PersonViewModel.cs):

csharp 复制代码
public class PersonViewModel : INotifyPropertyChanged
{
    private Person _person;

    public PersonViewModel()
    {
        _person = new Person { Name = "Tom", Age = 30 };
    }

    public string PersonName
    {
        get { return _person.Name; }
        set
        {
            if (_person.Name != value)
            {
                _person.Name = value;
                OnPropertyChanged("PersonName");
            }
        }
    }

    public int PersonAge
    {
        get { return _person.Age; }
        set
        {
            if (_person.Age != value)
            {
                _person.Age = value;
                OnPropertyChanged("PersonAge");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

View(MainWindow.xaml):

xml 复制代码
<Window x:Class="MVVMExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MVVMExample"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Label Content="Name" />
            <TextBox Text="{Binding PersonName}" />
            <Label Content="Age" />
            <TextBox Text="{Binding PersonAge}" />
        </StackPanel>
    </Grid>
</Window>

在这个例子中,我们创建了一个表示人的模型(Person)。视图模型(PersonViewModel)包含了一个人的实例,并有两个属性,分别对应人的名字和年龄。这两个属性在设置值时触发PropertyChanged事件,这样用户界面就可以知道值已经改变。最后,视图(MainWindow.xaml)中的两个文本框分别绑定到了视图模型的PersonName和PersonAge属性。

注意,为了让这个例子工作,你需要在MainWindow的构造函数中设置DataContext:

csharp 复制代码
public MainWindow()
{
    InitializeComponent();
    this.DataContext = new PersonViewModel();
}

这样,视图就可以通过数据绑定访问视图模型的属性了。

相关推荐
故渊at17 小时前
第二板块:Android 四大组件标准化学理 | 第十二篇:四大组件全景总结与系统服务(System Server)架构
android·架构·wpf·四大组件·system service
伶俜6620 小时前
# [特殊字符] 零基础学 ArkUI 数据持久化(专题三):5 种存储方案深度对比
学习·华为·wpf·harmonyos
IT策士20 小时前
Redis 从入门到精通:数据结构String 与键管理
数据结构·redis·wpf
AC赳赳老秦21 小时前
技术文章素材收集自动化:用 OpenClaw 自动爬取行业资讯、技术热点、优质文章
运维·开发语言·python·自动化·wpf·deepseek·openclaw
加号321 小时前
【WPF】 Storyboard 故事板动画设计深度解析
wpf
xiaoshuaishuai81 天前
C# Avalonia 依赖属性与WPF的区别
开发语言·c#·wpf
大G的笔记本1 天前
生产级 Spring Boot 网关简单实现方案
wpf
稷下元歌3 天前
七天学会plc加机器视觉之AI 接入 外设模块开发全详细操作文档(全程配套视频按文档实操)
python·sql·qt·贪心算法·r语言·wpf·时序数据库
happyprince4 天前
11-Hugging Face Transformers 分布式与并行系统深度分析
分布式·c#·wpf
加号34 天前
【WPF】 基于 Canvas 读取并渲染 DXF 文件的技术指南
c#·wpf