本篇定位这是系列的第一篇,我们从最基础的 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...
CommunityToolkit.Mvvm 源码分析 (9) — RelayCommand 篇
本篇定位泛型版本 RelayCommand,支持命令参数。 1. 示例一:ListBox 选择12345678910111213141516171819202122232425public partial class Product...
CommunityToolkit.Mvvm 源码分析 (8) — StrongReferenceMessenger 篇
本篇定位StrongReferenceMessenger 使用强引用,数据结构完全不同。 1. 何时用 StrongReferenceMessenger?123456789101112131415161718192021222324...
CommunityToolkit.Mvvm 源码分析 (10) — AsyncRelayCommandOptions 篇
本篇定位AsyncRelayCommandOptions 是 8.0 新增的 [Flags] 枚举,控制异步命令的并发和异常行为。 1. 枚举定义1234567[Flags]public enum AsyncRelayCommand...