ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零搭建工业控制系统(一):快速搭建高效开发框架

从零搭建工业控制系统(一):快速搭建高效开发框架 WPF入门从空白项目到MVVM骨架搭建这是「从零搭建工业控制系统」系列第1篇。从零开始手把手搭建一个可维护的WPF项目骨架。为什么你需要MVVM三年前我接手一个半导体设备控制软件项目打开 MainWindow.xaml.cs映入眼帘的是2000行代码按钮点击事件、设备通信、UI更新、定时器逻辑全堆在一个文件里。改一个按钮的文字颜色要在一堆业务逻辑里小心翼翼地找。加一个新功能牵一发动全身。MVVMModel-View-ViewModel解决的就是这个问题View界面只管长什么样ViewModel逻辑只管数据和命令Model数据只管业务模型三者通过数据绑定连接各司其职互不干扰。CommunityToolkit.Mvvm微软官方的MVVM工具包传统MVVM写法每个属性都要手写INotifyPropertyChanged每个命令都要实现ICommand接口代码又臭又长。CommunityToolkit.Mvvm是微软官方维护的轻量级MVVM库用源代码生成器技术自动生成样板代码。你只需要加一个[ObservableProperty]特性编译器就帮你搞定一切。对比一下对比项传统手写CommunityToolkit.Mvvm属性通知15行重复代码1行特性搞定命令绑定实现ICommand接口1行特性搞定学习曲线低但代码繁琐最低包体积无依赖很小按需引用第一步创建项目 安装包1.1 创建WPF项目打开 Visual Studio 2022 → 新建项目 →WPF应用程序→ 命名MvvmTutorial→ .NET 8。1.2 安装 CommunityToolkit.Mvvm工具 → NuGet包管理器 → 程序包管理器控制台输入Install-PackageCommunityToolkit.Mvvm1.3 建立项目目录结构MvvmTutorial/ ├── Models/ # 数据模型 ├── ViewModels/ # 视图模型 ├── Views/ # 界面 └── App.xaml # 应用入口第二步写你的第一个ViewModel在ViewModels/下新建MainViewModel.csusingCommunityToolkit.Mvvm.ComponentModel;usingCommunityToolkit.Mvvm.Input;namespaceMvvmTutorial.ViewModels{// 关键1partial类源代码生成器才能工作// 关键2继承 ObservableObject自带属性变更通知publicpartialclassMainViewModel:ObservableObject{// 关键3[ObservableProperty] 自动生成公共属性 通知[ObservableProperty]privateintcount0;[ObservableProperty]privatestringstatus就绪;// 关键4[RelayCommand] 自动生成命令属性[RelayCommand]privatevoidIncrement(){Count;Status$已点击{Count}次;}[RelayCommand]privatevoidReset(){Count0;Status已重置;}}}3个关键点解读①partial class— 必须加源代码生成器在编译时生成另一半代码。②[ObservableProperty]— 标记在私有字段上编译器自动生成公共属性count→Count赋值时自动触发界面刷新。你不用写一行OnPropertyChanged。③[RelayCommand]— 标记在方法上编译器自动生成同名命令属性Increment→IncrementCommand可直接绑定到按钮。第三步写界面 绑定在Views/下新建MainWindow.xamlWindowx:ClassMvvmTutorial.Views.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlTitleMVVM入门Height300Width400StackPanelVerticalAlignmentCenterHorizontalAlignmentCenter!-- 显示计数 --TextBlockText{Binding Count}FontSize48HorizontalAlignmentCenter/!-- 显示状态 --TextBlockText{Binding Status}FontSize16Margin0,10HorizontalAlignmentCenter/!-- 按钮绑定命令 --StackPanelOrientationHorizontalHorizontalAlignmentCenterMargin0,20ButtonContent点击1Command{Binding IncrementCommand}Padding20,10Margin5/ButtonContent重置Command{Binding ResetCommand}Padding20,10Margin5//StackPanel/StackPanel/Window绑定语法解读{Binding Count}— 把TextBlock的Text绑定到ViewModel的Count属性Count变了界面自动更新{Binding IncrementCommand}— 把Button的Command绑定到ViewModel的IncrementCommand命令点击按钮自动调用Increment方法第四步连接View和ViewModel这一步是MVVM最关键的一步— 把View和ViewModel绑在一起。打开MainWindow.xaml.csusingMvvmTutorial.ViewModels;usingSystem.Windows;namespaceMvvmTutorial.Views{publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();// 这一行就是MVVM的灵魂DataContextnewMainViewModel();}}}DataContext new MainViewModel()— 设置数据上下文后XAML里所有{Binding xxx}都会去ViewModel里找对应属性和命令。第五步运行按 F5 运行你会看到点击「点击1」按钮数字递增状态文字更新点击「重置」按钮数字归零状态变为「已重置」全程没有一行手动刷新UI的代码。这就是MVVM的魔力 — 数据变了界面自动变。进阶带条件判断的命令实际项目中按钮不是永远能点的。比如「设备运行中时禁止再点启动」。CommunityToolkit.Mvvm 原生支持publicpartialclassMainViewModel:ObservableObject{[ObservableProperty]privateboolisRunningfalse;// CanExecute 方法名 命令方法名 CanExecute[RelayCommand(CanExecutenameof(CanStart))]privatevoidStart(){IsRunningtrue;}privateboolCanStart()!IsRunning;// 当 IsRunning 变化时通知命令刷新按钮状态partialvoidOnIsRunningChanged(boolvalue){StartCommand.NotifyCanExecuteChanged();}}XAML中按钮绑定不变当IsRunning true时按钮自动变灰禁用。真实项目长什么样以上是入门示例。来看看我在实际工业项目中怎么用// 真实项目半导体设备控制软件 HomeViewModelpublicpartialclassHomeViewModel:ObservableObject,IDisposable{// 属性20个 [ObservableProperty] [ObservableProperty]privateboolisAutoModetrue;[ObservableProperty]privateboolisManualModefalse;[ObservableProperty]privateintalarmCount0;[ObservableProperty]privatedoublechamberPressure0;// 腔体压力[ObservableProperty]privatedoubleheater1TempAct0;// 加热器实际温度// 命令模式切换、设备控制 [RelayCommand]privatevoidAutoMode(){IsAutoModetrue;IsManualModefalse;}[RelayCommand]privatevoidManualMode(){IsAutoModefalse;IsManualModetrue;}[RelayCommand(CanExecutenameof(CanRunWhenIdle))]privatevoidRunSequence(){// 执行工艺配方...}privateboolCanRunWhenIdle()!_commandService.IsBusy;}对应的XAML绑定!-- 模式切换控件 --operator:AutoManualSwitchIsLeftActive{Binding IsAutoMode, ModeOneWay}LeftCommand{Binding AutoModeCommand}RightCommand{Binding ManualModeCommand}/!-- 报警控件 --operator:WarningAlarmCount{Binding AlarmCount}WarningCommand{Binding WarningCommand}/一个 ViewModel 管理几十个属性和命令但代码依然清晰可读。这就是 CommunityToolkit.Mvvm 的威力。本篇小结知识点关键代码属性自动通知[ObservableProperty] private int count;命令自动生成[RelayCommand] private void DoSomething()命令条件判断[RelayCommand(CanExecute nameof(CanDo))]连接View和VMDataContext new MainViewModel();XAML绑定{Binding Count}/{Binding DoSomethingCommand}5个核心知识点搭建一个完整的MVVM骨架。下期预告第2篇MVVM实战 — RelayCommand绑定按钮到ViewModel方法我们将深入命令系统异步命令、带参数命令、命令的CanExecute动态刷新以及在真实项目中如何用反射批量通知命令状态。
返回列表