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逻辑与业务逻辑分离。视图模型负责处理业务逻辑,并通过数据绑定与视图进行交互。这种设计模式使得代码更加模块化,易于测试和维护。

相关推荐
当下就是最好5 小时前
WPF应用程序的生命周期-笔记
wpf
九鼎科技-Leo19 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
麻花20131 天前
C#之WPF的C1FlexGrid空间的行加载事件和列事件变更处理动态加载的枚举值
开发语言·c#·wpf
lcintj1 天前
【WPF】Prism学习(九)
学习·wpf·prism
界面开发小八哥1 天前
界面控件DevExpress WPF中文教程:网格视图数据布局的列和卡片字段
wpf·界面控件·devexpress·ui开发·用户界面
△曉風殘月〆1 天前
如何在WPF中嵌入其它程序
wpf
Crazy Struggle1 天前
功能齐全的 WPF 自定义控件资源库(收藏版)
.net·wpf·ui控件库
shepherd枸杞泡茶2 天前
WPF动画
c#·.net·wpf
lcintj2 天前
【WPF】Prism学习(十)
学习·wpf·prism
wyh要好好学习2 天前
WPF数据加载时添加进度条
ui·wpf