using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; namespace BITKit.UX.DataBind { public abstract class UXDataBind : MonoBehaviour where TVisualElement : VisualElement, new() { [SerializeReference, SubclassSelector] protected IReference dataName; [SerializeReference, SubclassSelector] protected IReference visualElementName; [SerializeField] protected UIDocument document; protected TVisualElement visualElement { get; private set; } protected virtual void Start() { visualElement = document.rootVisualElement.Q(visualElementName.Value); if (visualElement is INotifyValueChanged notifyValueChanged) notifyValueChanged.RegisterValueChangedCallback(OnValueChanged); Data.AddListener(dataName.Value, OnData); destroyCancellationToken.Register(() => { Data.RemoveListender(dataName.Value, OnData); }); } private void OnData(TData obj) { if (visualElement is INotifyValueChanged notifyValueChanged) notifyValueChanged.SetValueWithoutNotify(obj); } private void OnValueChanged(ChangeEvent changeEvent) { Data.Set(dataName.Value, changeEvent.newValue); } } }