36 lines
1.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
|