很多对比WinForm和WPF的文章总会拿MVVM模式编程来说事。什么WPF搭配MVVM框架编程多么多么爽。其实WinForm也可以实现MVVM模式编程,只不过工控上位机使用MVVM模式对于效率提升不是那么显著,所以我一般也不用。
WinForm实现MVVM模式编程可以使用CommunityToolkit或者ReactiveUI框架都行。以使用CommunityToolkit框架为例,先通过NuGet安装CommunityToolkit.Mvvm包。
创建一个类,命名为MainViewModel,输入下面代码。
namespace MVVMExample
{
publicclassMainViewModel : ObservableObject
{
privateint_data;
publicintData
{
get => _data;
set => SetProperty(ref _data, value);
}
publicRelayCommand DataAddCommand { get; }
publicMainViewModel()
{
DataAddCommand = newRelayCommand(ExecuteAddItemCommand);
}
privatevoidExecuteAddItemCommand()
{
Data++;
}
}
}
再将自动创建的Form1重命名为MainView。窗体分别添加两个TextBox和一个Button控件,布局如下。
窗体视图MainView添加代码如下。
publicpartialclassMainView : Form
{
publicMainView(MainViewModel viewModel)
{
InitializeComponent();
_viewModel = newMainViewModel();
BindingConfig();
}
privatereadonlyMainViewModel _viewModel;
privatevoidMainView_Load(objectsender, EventArgs e)
{
}
privatevoidBindingConfig()
{
// 绑定属性
textBox1.DataBindings.Add(nameof(textBox1.Text), _viewModel, nameof(_viewModel.Data));
textBox2.DataBindings.Add(nameof(textBox2.Text), _viewModel, nameof(_viewModel.Data));
// 绑定命令
button1.Click += (s, e) => _viewModel.DataAddCommand.Execute(null);
}
}
上面代码中,窗体视图MainView中的两个TextBox控件的Text属性都绑定到了MainViewModel中的Data.运行程序就可以看到当点击按钮时两个TextBox控件数据跟着同时刷新。当修改任意一个TextBox控件中的数据时,比如修改到100,那么再次点击按钮时,数据从100开始递增。
以上是MVVM模式编程在WinForm上比较简单的实现,我们也可以结合
Microsoft.Extensions.DependencyInjection实现更加复杂的功能。