diff --git a/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs b/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs index 7455f31..8d5747a 100644 --- a/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs +++ b/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs @@ -30,6 +30,9 @@ namespace XericUI.XTable.Rendering.Elements /// 是否已绑定 private bool m_IsBound; + /// 是否正在注册字段,防止 StyleManager 同步回调导致重复注册。 + private bool m_IsBinding; + /// 样式变更时触发(通知表格重绘) public event System.Action OnStyleChangedCallback; @@ -46,6 +49,7 @@ namespace XericUI.XTable.Rendering.Elements /// public void Bind(string styleNamespace) { + if (m_IsBinding && m_StyleNamespace == styleNamespace) return; if (m_IsBound) Unbind(); m_StyleNamespace = styleNamespace; @@ -56,19 +60,33 @@ namespace XericUI.XTable.Rendering.Elements if (namespaces == null || !namespaces.Contains(styleNamespace)) return; - // 预注册常用路径 - RegisterField("/cell/bg/color", OnStyleChanged); - RegisterField("/cell/fg/color", OnStyleChanged); - RegisterField("/cell/border/top/color", OnStyleChanged); - RegisterField("/cell/border/bottom/color", OnStyleChanged); - RegisterField("/cell/border/left/color", OnStyleChanged); - RegisterField("/cell/border/right/color", OnStyleChanged); - RegisterField("/cell/font/size", OnStyleChanged); - RegisterField("/cell/font/alignment", OnStyleChanged); - RegisterField("/cell/font/richText", OnStyleChanged); - + // 先提交绑定状态。StyleField.Register 可能同步触发外部渲染;若此时仍显示未绑定, + // 同一对象会被再次 Bind 并重复注册,最终耗尽调用栈。 m_IsBound = true; - RefreshAll(); + m_IsBinding = true; + try + { + // 预注册常用路径 + RegisterField("/cell/bg/color", OnStyleChanged); + RegisterField("/cell/fg/color", OnStyleChanged); + RegisterField("/cell/border/top/color", OnStyleChanged); + RegisterField("/cell/border/bottom/color", OnStyleChanged); + RegisterField("/cell/border/left/color", OnStyleChanged); + RegisterField("/cell/border/right/color", OnStyleChanged); + RegisterField("/cell/font/size", OnStyleChanged); + RegisterField("/cell/font/alignment", OnStyleChanged); + RegisterField("/cell/font/richText", OnStyleChanged); + RefreshAll(); + } + catch + { + Unbind(); + throw; + } + finally + { + m_IsBinding = false; + } } ///