Net.Like.Xue.Tokyo/Assets/BITKit/Unity/Scripts/UX/DataBind/UXDataBind.cs

36 lines
1.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace BITKit.UX.DataBind
{
public abstract class UXDataBind<TData, TVisualElement> : 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<TVisualElement>(visualElementName.Value);
if (visualElement is INotifyValueChanged<TData> notifyValueChanged)
notifyValueChanged.RegisterValueChangedCallback(OnValueChanged);
Data.AddListener<TData>(dataName.Value, OnData);
destroyCancellationToken.Register(() => { Data.RemoveListender<TData>(dataName.Value, OnData); });
}
private void OnData(TData obj)
{
if (visualElement is INotifyValueChanged<TData> notifyValueChanged)
notifyValueChanged.SetValueWithoutNotify(obj);
}
private void OnValueChanged(ChangeEvent<TData> changeEvent)
{
Data.Set<TData>(dataName.Value, changeEvent.newValue);
}
}
}