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