MVVM(Model - View - ViewModel)是一种软件架构模式,主要用于构建用户界面。它将应用程序分为三个核心部分:Model(模型)、View(视图)和 ViewModel(视图模型)。这种架构模式有助于分离关注点,使得代码更易于维护、测试和扩展。
其主要目标是通过数据绑定和命令来实现视图与业务逻辑之间的松耦合,使得开发人员可以独立地开发和修改视图、业务逻辑,而不会相互干扰。
Model 代表应用程序的数据和业务逻辑。它可以是数据库访问层、数据实体类、业务规则等。例如,在一个简单的用户管理系统中,Model 可能包含用户类(User),其中有用户的属性(如用户名、密码、邮箱等)以及操作这些属性的方法(如验证密码、更新用户信息等)。
Model 通常不应该包含任何与用户界面相关的代码,它只关注数据本身的结构和操作。
public class User
{
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public bool ValidatePassword(string inputPassword)
{
return Password == inputPassword;
}
}
View 是用户界面的呈现部分,它可以是 Windows Forms、WPF(Windows Presentation Foundation)、ASP.NET页面等。View 负责展示数据给用户,并接收用户的输入。
它通过数据绑定与 ViewModel 进行通信,以获取要显示的数据,并将用户的操作(如按钮点击、文本输入等)转换为命令发送给 ViewModel。
假设我们有一个简单的登录窗口,XAML 代码可能如下:
<Window xamlns="http://schemas.microsoft.com/winfoml/2008/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfoml/2008/xaml"
Title="Login Window">
<Grid>
<StackPanel>
<TextBox x:Name="UsernameTextBox" />
<PasswordBox x:Name="PasswordTextBox" />
<Button Content="Login" Command="{Binding LoginCommand}" />
</StackPanel>
</Grid>
</Window>
在这个例子中,视图包含两个输入框(用于输入用户名和密码)和一个登录按钮。按钮的Command属性通过数据绑定与 ViewModel 中的LoginCommand相关联,用于处理登录操作。
ViewModel(视图模型)部分
ViewModel 是连接 View 和 Model 的桥梁。它包含了视图所需的数据(以属性形式存在),并且这些数据通常是从 Model 获取并经过适当的转换或处理后提供给视图的。
它还定义了一系列命令(实现ICommand接口),这些命令用于处理视图中的用户操作,如按钮点击、菜单选择等。ViewModel 会调用 Model 中的业务逻辑来执行实际的操作。
using System;
using System.ComponentModel;
using System.Windows.Input;
public class LoginViewModel : INotifyPropertyChanged
{
private User _user;
private string _username;
private string _password;
public LoginViewModel()
{
_user = new User();
LoginCommand = new RelayCommand(ExecuteLogin, CanExecuteLogin);
}
public ICommand LoginCommand { get; private set; }
public string Username
{
get { return _username; }
set
{
_username = value;
OnPropertyChanged(nameof(Username));
}
}
public string Password
{
get { return _password; }
set
{
_password = value;
OnPropertyChanged(nameof(Password));
}
}
private bool CanExecuteLogin()
{
return!string.IsNullOrEmpty(Username) &&!string.IsNullOrEmpty(Password);
}
private void ExecuteLogin()
{
_user.Username = Username;
_user.Password = Password;
// 这里可以添加更多登录验证逻辑,比如调用服务端API等
if (_user.ValidatePassword(Password))
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("登录失败");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
在这个 ViewModel 中:
它包含了两个属性Username和Password,用于与视图中的输入框进行数据绑定。当视图中的输入框内容发生变化时,这些属性会通过OnPropertyChanged方法通知视图进行更新。
LoginCommand是一个命令,用于处理登录操作。它通过RelayCommand(假设RelayCommand是一个自定义的实现ICommand接口的类)来关联ExecuteLogin(执行登录操作的方法)和CanExecuteLogin(判断是否可以执行登录操作的方法)。
在ExecuteLogin方法中,它将视图中的用户名和密码赋值给User对象,并调用User对象的ValidatePassword方法进行密码验证,根据验证结果输出相应的信息。
在 MVVM 架构中,数据绑定是关键的通信方式。例如在 WPF 中,通过{Binding}标记扩展来实现视图和 ViewModel 之间的数据绑定。如TextBox的Text属性绑定到 ViewModel 中的Username属性,这样当视图中的文本框内容改变时,会自动更新 ViewModel 中的Username属性,反之亦然。
命令用于处理视图中的用户操作。以ICommand接口为基础,通过实现Execute和CanExecute方法来定义命令的执行逻辑和可用性。在视图中,按钮等控件的Command属性绑定到 ViewModel 中的命令,当按钮被按下时,会执行对应的命令方法。例如,登录按钮绑定到LoginCommand,当用户点击登录按钮时,会执行ExecuteLogin方法进行登录验证。
分离关注点:使得开发人员可以分别专注于界面设计(View)、业务逻辑(ViewModel 和 Model),提高开发效率和代码质量。
易于测试:ViewModel 可以独立于视图进行单元测试,因为它不依赖于特定的用户界面技术。可以使用模拟数据来测试 ViewModel 中的业务逻辑和命令。
代码复用:ViewModel 和 Model 中的代码可以在不同的视图应用场景中复用,例如,同一个 ViewModel 可以用于桌面应用和移动应用的视图。
在C#中,有多个流行的MVVM框架可供选择,这些框架提供了丰富的功能和组件,以支持MVVM架构的实现。以下是一些常用的MVVM框架:
功能强大的MVVM框架,支持模块化、插件化、事件聚合器和导航等功能。
提供了丰富的API和文档,适合构建大型企业级应用程序。
轻量级的MVVM框架,易于上手且提供了MESSENGER类方便不同ViewModel之间的通信。
适合中小型项目、快速开发和原型制作。
由微软支持并定期更新的MVVM框架,提供了丰富的MVVM组件和工具。
适用于各种规模的项目,特别是需要与Windows社区工具包集成的项目。
小巧而强大的MVVM框架,支持约定优于配置的原则。
通过简化开发者的工作流程来提高开发效率。
小白路漫漫,让我们一起加油!!!