.NET 7 中 Windows Forms 绑定的改进以支持 MVVM

.NET 7框架中的命令绑定预览功能

.NET 7框架引入了命令绑定预览功能,旨在现代化Windows Forms应用程序。这些新特性允许UI控件像其他.NET UI框架(如MAUI)一样绑定到视图模型和命令。

主要变化

  1. ButtonBase类新增Command属性:允许按钮绑定到命令。
  2. ToolStripItem类新增Command属性:允许工具栏项绑定到命令。
  3. Control类新增DataContext属性:作为环境属性,如果未设置,则从父控件中获取。

优势

  • 解耦UI与业务逻辑:开发者可以使用ViewModel或控制器来分离UI和业务逻辑。
  • 简化单元测试:可以分别测试逻辑和UI。
  • 与现代ORM工具对齐:与Entity Framework Core生成的模型兼容,无需依赖DataTableDataSet类。
  • Visual Studio Forms Designer支持:自动创建必要的绑定和绑定集合,支持绑定到具有属性和命令的对象。

命令属性支持

  • ICommand接口:支持ExecuteCanExecute方法和CanExecuteChanged事件。

    • 点击按钮时,调用相关命令的Execute方法。
    • 如果命令的CanExecute方法返回false,按钮将被禁用。
  • 自定义命令类:开发者可以在ViewModel中创建自己的派生命令类,或使用社区.NET Toolkit中的RelayCommand类和代码生成器,减少样板代码。

背景与历史

Windows Forms曾因简化Windows GUI应用程序的开发而受到业务应用开发者的欢迎,但也导致了维护混乱,因为窗体代码隐藏类中混合了UI代码、业务逻辑代码甚至数据库连接代码。

后来的.NET UI框架(如WPF、UWP和MAUI)引入了新的设计模式,将领域特定代码从UI(现称为View)中移除,并添加到称为ViewModel的专用组件中。在MVVM模式(Model-View-ViewModel)中,ViewModel负责处理数据和执行业务逻辑代码,使用.NET属性绑定到UI,并利用INotifyPropertyChanged接口来通知属性变化。

Windows Forms支持绑定到数据源,可以是ADO.NET中的DataSet/DataTable,也可以是对象(自.NET Framework 2.0起)。虽然对象数据源可以解耦数据与UI层,但非数据更新的用户UI交互(如按钮点击)仍留在Windows Forms代码隐藏文件中。此外,将数据源传播到窗体上的子控件也很困难,因为Windows Forms绑定是控件特定的。

未来发展

2021年5月,Windows Forms项目在GitHub上提出了一个新的API提案,呼吁为按钮添加命令绑定支持,并为窗体或用户控件添加集中化的DataContext属性。到2022年8月,该功能基本完成,并在.NET 7中以预览版发布。预计2023年11月发布的.NET 8将默认包含这些功能。

阅读 51
0 条评论