从 MVVMLight 到 CommunityToolkit.Mvvm:MVVM 框架的现代化演进与全面对比

张开发
2026/4/13 12:35:44 15 分钟阅读

分享文章

从 MVVMLight 到 CommunityToolkit.Mvvm:MVVM 框架的现代化演进与全面对比
本文围绕MVVMLight 与 CommunityToolkit.Mvvm 的演进脉络、核心对比、实操差异及迁移指南展开帮助开发者快速完成技术选型与项目升级。在 WPF、UWP、MAUI、WinUI 3 等 XAML 技术体系中MVVM 是实现界面与业务逻辑解耦的核心架构模式。提到 MVVM 框架开发者通常会经历这样一个认知路径经典方案MVVMLight现代标准CommunityToolkit.Mvvm随着 .NET 进入统一平台时代.NET Core / .NET 5MVVMLight 逐渐退出主流舞台而 CommunityToolkit.Mvvm 成为官方推荐方案。一、历史渊源从个人开源到微软官方1.1 MVVMLight开源时代的经典之作创始人Laurent Bugnion 发展阶段2009发布 MVVM Light Toolkit2011–2018支持 WPF / Silverlight / Windows Phone / Xamarin后期进入维护模式Legacy 设计理念轻量无侵入只做核心ViewModel / Command / Messenger⚠️ 当前状态✔ 可运行于 .NET Core / .NET 5基于 .NET Standard❌ 不再积极维护❌ 不支持 AOT / 源生成器⚠️ 已进入历史阶段1.2 CommunityToolkit.Mvvm现代 .NET 标准答案核心开发者Sergio Pedri 微软团队 发展阶段2020.04项目启动受 MVVMLight 启发并提供迁移指导2020项目启动Windows Community Toolkit 内2021v7.0 发布更名为 CommunityToolkit.Mvvm 并加入 .NET 基金会20228.0 引入源码生成器2024支持 .NET 9 NativeAOT 与 MVVMLight 的关系官方说明该库受 MVVMLight 启发并与 Laurent 共同制定迁移路径。 关键结论❌ 不是 Laurent 创建✅ 微软主导开发✅ 面向现代 .NET1.3 核心演进总结维度演进方向维护模式个人 → 官方技术架构MVVMLight运行时机制基于 INotifyPropertyChanged 反射/手写实现CommunityToolkit.Mvvm编译期源生成器Source Generator性能运行时 → 编译时平台单一 → 全平台功能基础 → 现代化二、核心维度对比对比维度MVVMLightCommunityToolkit.Mvvm创始人Laurent Bugnion微软团队项目性质个人开源官方工具包维护状态⚠️ Legacy✅ 活跃技术架构反射源生成器性能MVVMLight运行时绑定 手动通知机制CommunityToolkit.Mvvm编译期生成减少运行时开销异步命令支持❌需手动封装✅原生支持 IAsyncRelayCommandAOT 支持❌✅代码生成❌✅三、核心功能实操对比注释增强版3.1 ViewModel 实现MVVMLight传统写法usingGalaSoft.MvvmLight;// 继承 ViewModelBase内部实现 INotifyPropertyChangedpublicclassMainViewModel:ViewModelBase{// ① 手动字段privatestring_userName;// ② 手动属性publicstringUserName{get_userName;// ③ 调用 Set 触发通知setSet(ref_userName,value);/* * Set 做了 * 1. 判断值是否变化 * 2. 更新字段 * 3. 触发 PropertyChanged */}} 缺点手写属性强依赖基类样板代码多CommunityToolkit.Mvvm现代写法usingCommunityToolkit.Mvvm.ComponentModel;// 必须 partial源码生成器需要publicpartialclassMainViewModel:ObservableObject{// 自动生成属性[ObservableProperty]privatestring_userName;/* * 自动生成 * public string UserName * { * get _userName; * set SetProperty(ref _userName, value); * } */} 优势零样板代码编译期生成支持 AOT3.2 命令绑定MVVMLight手动命令usingGalaSoft.MvvmLight;usingGalaSoft.MvvmLight.Command;publicclassMainViewModel:ViewModelBase{// ICommand 属性publicICommandSubmitCommand{get;}publicMainViewModel(){// 手动绑定SubmitCommandnewRelayCommand(ExecuteSubmit);}// 执行逻辑privatevoidExecuteSubmit(){Console.WriteLine(执行提交);}} 问题手动 new不支持 asyncCommunityToolkit.Mvvm自动命令usingCommunityToolkit.Mvvm.ComponentModel;usingCommunityToolkit.Mvvm.Input;publicpartialclassMainViewModel:ObservableObject{// 自动生成 SubmitCommand[RelayCommand]privatevoidSubmit(){Console.WriteLine(同步执行);}/* * 自动生成 * public ICommand SubmitCommand { get; } */// 自动生成 AsyncSubmitCommand[RelayCommand]privateasyncTaskAsyncSubmit(){awaitTask.Delay(1000);Console.WriteLine(异步完成);}/* * 自动生成 * public IAsyncRelayCommand AsyncSubmitCommand { get; } */} 优势方法即命令原生 async更简洁3.3 消息通信MVVMLight强引用usingGalaSoft.MvvmLight.Messaging;// 发送Messenger.Default.Send(测试消息);publicclassMainViewModel:ViewModelBase{publicMainViewModel(){// 注册强引用Messenger.Default.Registerstring(this,msg{Console.WriteLine(msg);});/* * ⚠️ 强引用问题 * 未及时 Unregister 时在复杂生命周期场景下可能导致内存泄漏 */}// 必须手动释放publicvoidCleanup(){Messenger.Default.Unregister(this);}}CommunityToolkit.Mvvm弱引用usingCommunityToolkit.Mvvm.ComponentModel;usingCommunityToolkit.Mvvm.Messaging;// 发送WeakReferenceMessenger.Default.Send(测试消息);publicpartialclassMainViewModel:ObservableObject{publicMainViewModel(){// 注册弱引用WeakReferenceMessenger.Default.Registerstring(this,(r,msg){Console.WriteLine(msg);});/* * ✔ 自动释放 * ✔ 无需 Unregister */}} 优势弱引用避免内存泄漏自动管理生命周期API 更现代化四、技术选型建议非常重要 新项目 直接选择✅ CommunityToolkit.Mvvm❌ 不建议使用 MVVMLight 的原因已停止演进不支持现代 .NET不支持 AOT存在内存风险✅ CommunityToolkit.Mvvm 核心价值微软官方维护高性能零反射支持 MAUI / WinUI / WPF极致减少代码量五、迁移指南精华MVVMLightCommunityToolkitViewModelBaseObservableObjectSet()[ObservableProperty]RelayCommand[RelayCommand]MessengerWeakReferenceMessenger六、一句话总结MVVMLight 是“过去的最佳实践”而 CommunityToolkit.Mvvm 是“当前与未来的标准答案”。七、结尾建议保留如果你正在维护老项目✅ 可以继续使用 MVVMLight稳定即可 新功能建议逐步迁移如果你在做新项目不要再犹豫直接使用 CommunityToolkit.Mvvm。 关注我持续分享 C# 实战技巧、代码示例 技术干货

更多文章