随着软件应用的复杂性和用户界面的需求日益增长,传统的开发模式已难以满足高效开发和维护的需要。MVVM(Model-View-ViewModel)作为一种设计模式,提供了清晰的架构,解耦了界面和业务逻辑,提升了代码的可维护性和可测试性。本文将详细介绍 MVVM 设计模式,并结合 CommunityToolkit.Mvvm,在 WinForms 应用中演示其实际应用。
MVVM 是一种架构设计模式,将应用程序分为三个核心组件:
CommunityToolkit.Mvvm 是微软提供的开源 MVVM 框架,轻量级且功能强大,旨在简化 MVVM 模式的实现。它提供了属性更改通知、命令、消息传递等常用功能。
ObservableObject:基类,实现了 INotifyPropertyChanged 接口,简化属性通知。RelayCommand:实现命令模式,方便处理用户交互事件。ObservableCollection:支持集合的变化通知。虽然 WinForms 并非为 MVVM 设计,但通过 CommunityToolkit.Mvvm,我们仍然可以在 WinForms 中应用 MVVM 模式。
CommunityToolkit.Mvvm 包。BashInstall-Package CommunityToolkit.Mvvm

我们将创建一个简单的计算器应用,实现两个数字相加的功能。
C#public class CalculatorModel
{
public double Number1 { get; set; }
public double Number2 { get; set; }
}
C#using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppMVVM
{
public partial class CalculatorViewModel : ObservableObject
{
private readonly CalculatorModel _calculatorModel;
public CalculatorViewModel()
{
_calculatorModel = new CalculatorModel();
}
[ObservableProperty]
private double number1;
[ObservableProperty]
private double number2;
[ObservableProperty]
private double result;
[RelayCommand]
private void Add()
{
Result = Number1 + Number2;
}
}
}
在设计器中添加以下控件:
TextBox,用于输入数字。Button,用于触发计算。Label,用于显示结果。在 Form 的构造函数中,绑定 ViewModel:
C#namespace AppMVVM
{
public partial class Form1 : Form
{
private readonly CalculatorViewModel _viewModel;
public Form1()
{
InitializeComponent();
_viewModel = new CalculatorViewModel();
// 绑定数据
txtNumber1.DataBindings.Add("Text", _viewModel, nameof(_viewModel.Number1), true, DataSourceUpdateMode.OnPropertyChanged);
txtNumber2.DataBindings.Add("Text", _viewModel, nameof(_viewModel.Number2), true, DataSourceUpdateMode.OnPropertyChanged);
lblResult.DataBindings.Add("Text", _viewModel, nameof(_viewModel.Result));
// 绑定命令
btnAdd.Click += (s, e) => _viewModel.AddCommand.Execute(null);
}
}
}

输入两个数字,点击“计算”按钮,即可在标签上看到结果。
ObservableProperty:自动生成属性的 getter、setter 以及属性变化通知。RelayCommand:简化命令的创建,无需手动实现 ICommand 接口。通过上述示例,我们在 WinForms 中成功应用了 MVVM 设计模式。尽管 WinForms 不是为 MVVM 量身定制,但借助 CommunityToolkit.Mvvm,我们仍然可以享受到 MVVM 带来的优势,如代码解耦、数据绑定和更好的可测试性。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!