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();
}
}