WPF入门教学十三 MVVM模式简介

MVVM(Model-View-ViewModel)是一种软件架构设计模式,特别适用于WPF和UWP等UI框架。MVVM模式的主要目标是将UI逻辑与业务逻辑分离,从而提高代码的可测试性、可维护性和可重用性。以下是MVVM模式的简介和示例。

MVVM模式简介

Model(模型)
  • 定义:模型代表应用程序的数据和业务逻辑。
  • 职责:处理数据的获取、存储和处理,以及业务规则的实现。
View(视图)
  • 定义:视图是用户界面,负责显示数据和接收用户输入。
  • 职责:通过数据绑定显示模型的数据,并将用户的操作传递给视图模型。
ViewModel(视图模型)
  • 定义:视图模型是模型和视图之间的桥梁,负责处理视图的业务逻辑。
  • 职责
    • 提供数据绑定所需的属性和命令。
    • 处理视图的交互逻辑。
    • 实现INotifyPropertyChanged接口以通知视图数据的变化。

MVVM模式的优势

  • 分离关注点:将UI逻辑与业务逻辑分离,使代码更易于理解和维护。
  • 可测试性:视图模型可以独立于视图进行单元测试。
  • 可重用性:视图模型可以在不同的视图中重用。

示例

Model(模型)

假设我们有一个简单的Person类:

复制代码
复制代码
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
ViewModel(视图模型)

接下来,我们创建一个PersonViewModel,它包含一个Person对象和一些命令:

复制代码
cs 复制代码
public class PersonViewModel : INotifyPropertyChanged
{
    private Person _person;
    public Person Person
    {
        get { return _person; }
        set
        {
            if (_person != value)
            {
                _person = value;
                OnPropertyChanged(nameof(Person));
            }
        }
    }

    public ICommand SaveCommand { get; }

    public PersonViewModel()
    {
        Person = new Person();
        SaveCommand = new RelayCommand(Save);
    }

    private void Save()
    {
        // Save logic here
        MessageBox.Show("Person saved!");
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

注意:这里使用了RelayCommand,它是MVVM中常用的命令实现方式。你可以自己实现一个简单的RelayCommand,或者使用第三方库如MVVMLight或Prism。

View(视图)

最后,我们在XAML中创建一个视图来显示Person的信息,并绑定命令:

复制代码
cs 复制代码
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp"
        Title="MVVM Example" Height="350" Width="525">
    <Window.DataContext>
        <local:PersonViewModel/>
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding Person.Name, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Text="{Binding Person.Age, UpdateSourceTrigger=PropertyChanged}"/>
            <Button Content="Save" Command="{Binding SaveCommand}"/>
        </StackPanel>
    </Grid>
</Window>

总结

通过上述示例,我们可以看到MVVM模式如何将UI逻辑与业务逻辑分离。视图模型负责处理业务逻辑,并通过数据绑定与视图进行交互。这种设计模式使得代码更加模块化,易于测试和维护。

相关推荐
无心水3 小时前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
LZL_SQ4 小时前
HCCL测试框架中AllReduce边界条件测试设计深度剖析
wpf·cann
User_芊芊君子1 天前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
就是有点傻2 天前
WPF按钮走马灯效果
wpf
zuozewei2 天前
虚拟电厂聚合商平台安全技术体系深度解读
安全·wpf
极客智造2 天前
WPF 自定义控件:AutoGrid 实现灵活自动布局的网格控件
wpf
极客智造2 天前
WPF Grid 布局高效扩展:GridHelpers 附加属性工具类全解析
wpf
张人玉2 天前
WPF 多语言实现完整笔记(.NET 4.7.2)
笔记·.net·wpf·多语言实现·多语言适配
暖馒2 天前
深度剖析串口通讯(232/485)
开发语言·c#·wpf·智能硬件
我要打打代码3 天前
WPF控件(2)
wpf