using System.Collections; using System.Collections.Generic; namespace XericUI.ReflectionUIGenerator { /// /// 绑定集合 — 统一管理所有 AvrgMvvmBinding,提供字符串索引器和前缀树快速查找 /// public class AvrgMvvmBindingCollection : IEnumerable { private List _bindings = new List(); private AvrgMvvmScheduler _scheduler; private AvrgBindingTrie _trie; /// /// 绑定的元数据集引用(可选) /// public AvrgMemberMetaDataSet SourceMetaDataSet { get; set; } /// /// 绑定数量 /// public int Count => _bindings.Count; /// /// 调度器引用(在 BuildMDVM 时设置) /// public AvrgMvvmScheduler Scheduler => _scheduler; /// /// 添加绑定 /// public void Add(AvrgMvvmBinding binding) { _bindings.Add(binding); } /// /// 设置前缀树索引(由 BuildMDVM 构建后注入) /// internal void SetTrie(AvrgBindingTrie trie) { _trie = trie; } /// /// 获取指定索引的绑定 /// public AvrgMvvmBinding this[int index] => _bindings[index]; /// /// 通过成员名访问绑定(如 bindingCollection["speed"]) /// get: 从数据源读取当前值 /// set: 走完整的 MVVM 管线:WriteFromData → MarkDataDirty → Flush → UI 同步 /// public object this[string memberName] { get { var binding = FindByMemberName(memberName); return binding?.ReadFromDataSource(); } set { var binding = FindByMemberName(memberName); if (binding != null && _scheduler != null) { binding.WriteFromData(value); _scheduler.MarkDataDirty(binding); _scheduler.Flush(); } } } /// /// 获取指定成员名称的绑定(优先查 Trie,回退线性查找) /// public AvrgMvvmBinding FindByMemberName(string memberName) { if (_trie != null) { var found = _trie.Find(memberName) ?? _trie.FindByMemberName(memberName); if (found != null) return found; } return _bindings.Find(b => b.MetaData?.MemberName == memberName); } /// /// 获取指定 Tag 类型的绑定列表 /// public List FindByTag(XuiavrgFieldTag tag) { return _bindings.FindAll(b => (b.MetaData?.Tag & tag) == tag); } /// /// 附加调度器 /// internal void AttachScheduler(AvrgMvvmScheduler scheduler) { _scheduler = scheduler; } /// /// 触发调度器 Flush,处理所有脏标记 /// public void Flush() { _scheduler?.Flush(); } /// /// 清空所有绑定 /// public void Clear() { _bindings.Clear(); _trie?.Clear(); _scheduler?.Clear(); } public IEnumerator GetEnumerator() => _bindings.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } }