Files
2026-07-25 23:45:29 +08:00

127 lines
3.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections;
using System.Collections.Generic;
namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 绑定集合 — 统一管理所有 AvrgMvvmBinding,提供字符串索引器和前缀树快速查找
/// </summary>
public class AvrgMvvmBindingCollection : IEnumerable<AvrgMvvmBinding>
{
private List<AvrgMvvmBinding> _bindings = new List<AvrgMvvmBinding>();
private AvrgMvvmScheduler _scheduler;
private AvrgBindingTrie _trie;
/// <summary>
/// 绑定的元数据集引用(可选)
/// </summary>
public AvrgMemberMetaDataSet SourceMetaDataSet { get; set; }
/// <summary>
/// 绑定数量
/// </summary>
public int Count => _bindings.Count;
/// <summary>
/// 调度器引用(在 BuildMDVM 时设置)
/// </summary>
public AvrgMvvmScheduler Scheduler => _scheduler;
/// <summary>
/// 添加绑定
/// </summary>
public void Add(AvrgMvvmBinding binding)
{
_bindings.Add(binding);
}
/// <summary>
/// 设置前缀树索引(由 BuildMDVM 构建后注入)
/// </summary>
internal void SetTrie(AvrgBindingTrie trie)
{
_trie = trie;
}
/// <summary>
/// 获取指定索引的绑定
/// </summary>
public AvrgMvvmBinding this[int index] => _bindings[index];
/// <summary>
/// 通过成员名访问绑定(如 bindingCollection["speed"]
/// get: 从数据源读取当前值
/// set: 走完整的 MVVM 管线:WriteFromData → MarkDataDirty → Flush → UI 同步
/// </summary>
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();
}
}
}
/// <summary>
/// 获取指定成员名称的绑定(优先查 Trie,回退线性查找)
/// </summary>
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);
}
/// <summary>
/// 获取指定 Tag 类型的绑定列表
/// </summary>
public List<AvrgMvvmBinding> FindByTag(XuiavrgFieldTag tag)
{
return _bindings.FindAll(b => (b.MetaData?.Tag & tag) == tag);
}
/// <summary>
/// 附加调度器
/// </summary>
internal void AttachScheduler(AvrgMvvmScheduler scheduler)
{
_scheduler = scheduler;
}
/// <summary>
/// 触发调度器 Flush,处理所有脏标记
/// </summary>
public void Flush()
{
_scheduler?.Flush();
}
/// <summary>
/// 清空所有绑定
/// </summary>
public void Clear()
{
_bindings.Clear();
_trie?.Clear();
_scheduler?.Clear();
}
public IEnumerator<AvrgMvvmBinding> GetEnumerator() => _bindings.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}