本篇定位前面 11 篇分析了源码,这篇用一个完整的便签应用串联所有知识点。 项目结构1234567891011121314NoteApp/├── Models/│ └── Note.cs # 数据...
CommunityToolkit.Mvvm 实战 (2) — 单元测试 ViewModel
本篇定位ViewMode l 包含业务逻辑,需要单元测试。CommunityToolkit.Mvvm 的设计使 ViewModel 可测性很好。 1. 测试 ObservableObject 属性123456789101112131...
CommunityToolkit.Mvvm 实战 (3) — DI 容器集成
本篇定位CommunityToolkit.Mvvm 不内置 DI 容器,但可以轻松集成 Microsoft.Extensions.DependencyInjection。这篇用示例演示完整集成方案。 1. 安装依赖12<Pac...
CommunityToolkit.Mvvm 源码分析 (1) — ObservableObject 篇
本篇定位这是系列的第一篇,我们从最基础的 ObservableObject 开始。读完你会理解: 为什么 SetProperty 的代码要重复编写而不是互相调用? INotifyPropertyChanging 有 Feature ...
CommunityToolkit.Mvvm 源码分析 (2) — RelayCommand 篇
本篇定位上一篇分析了 ObservableObject 的属性通知机制。这次来看命令系统——RelayCommand。读完你会理解: ICommand 的三个成员在框架内部如何落地? 为什么按钮有时不自动禁用/启用? Ca...
CommunityToolkit.Mvvm 源码分析 (3) — AsyncRelayCommand 篇
本篇定位前两篇覆盖了属性通知和同步命令。这篇从源码看 AsyncRelayCommand 的真正实现。读完你会理解: 为什么 ExecutionTask 要用属性 setter 而不是手动管理状态? 两种构造函数(Func<T...
CommunityToolkit.Mvvm 源码分析 (5) — Source Generators 篇
本篇定位Source Generators 是 8.0 最重磅的特性——在编译时生成代码,而不是在运行时通过反射。读完你会理解: [ObservableProperty] 在编译时到底生成了什么? [RelayCommand] 如何...
CommunityToolkit.Mvvm 源码分析 (4) — WeakReferenceMessenger 篇
本篇定位消息系统最复杂的部分。读完你会理解: 内部为什么不用 Dictionary 而是用 Dictionary2? ConditionalWeakTable2 如何实现”接收者被回收 → 自动取消订阅”? Send 方法如何用 S...
CommunityToolkit.Mvvm 源码分析 (6) — ObservableRecipient 篇
本篇定位ObservableRecipient 在 ObservableObject 之上增加了 IMessenger 消息收发能力。 1. 示例一:ViewModel 之间通信123456789101112131415161718...
CommunityToolkit.Mvvm 源码分析 (7) — ObservableValidator 篇
本篇定位ObservableValidator 在 ObservableObject 之上增加了 INotifyDataErrorInfo 数据注解验证。 1. 示例一:表单验证123456789101112131415161718...