TextBlock 确实是一个 UI 控件,它绑定了 CurrentWaferId。
但按照"UI 控件必须在 UI 线程更新"的规则,CurrentWaferId 的赋值也应该需要 Dispatcher.Invoke,但为什么不需要呢?
总结对比
| 属性 | 赋值方式 | 更新机制 | 是否需要 Dispatcher |
|---|---|---|---|
CurrentWaferId |
字符串赋值 | PropertyChanged → WPF 自动调度到 UI 线程 |
❌ 不需要 |
BottomBorderColor |
创建 Brush 对象并赋值 |
直接操作 DependencyProperty 的 SetValue |
✅ 必须 (Brush 创建不在 UI 线程) |
AddLog(DieChangedLogs.Insert) |
修改 ObservableCollection |
CollectionChanged → 需要 UI 线程触发 |
✅ 必须 (ListBox 更新 UI 需要 UI 线程) |
一句话总结
ObservableProperty的PropertyChanged事件 WPF 绑定系统会自动调度到 UI 线程,但创建Brush、修改ObservableCollection等操作需要手动用Dispatcher.Invoke切到 UI 线程。 🎯