20240918. 新增 BindableList
BindableProperty 很好用,但是不支持 List 等集合。
而 Bindable List 功能群友呼吁了很久了。
应群友要求,笔者实现了 Bindable List。
基本使用方式如下:
using System;
using UnityEngine;
using UnityEngine.UI;namespace QFramework.Example
{public class BindableListExample : MonoBehaviour{private BindableList<string> mNameList = new BindableList<string>();public Text NameTextTemplate;public Transform ContentRoot;private void Start(){NameTextTemplate.Hide();mNameList.OnCountChanged.Register(count =>{print("count:" + count);}).UnRegisterWhenGameObjectDestroyed(gameObject);mNameList.OnAdd.Register((index, newName) =>{print("add:" + index + "," + newName);NameTextTemplate.InstantiateWithParent(ContentRoot).SiblingIndex(index).Show().text = newName;}).UnRegisterWhenGameObjectDestroyed(gameObject);mNameList.OnMove.Register((oldIndex, newIndex, nameItem) =>{print("move:" + oldIndex + "," + newIndex + "," + nameItem);ContentRoot.GetChild(oldIndex).SiblingIndex(newIndex);}).UnRegisterWhenGameObjectDestroyed(gameObject);mNameList.OnRemove.Register((index, nameItem) =>{print("remove:" + index + "," + nameItem);ContentRoot.GetChild(index).DestroyGameObjGracefully();}).UnRegisterWhenGameObjectDestroyed(gameObject);mNameList.OnReplace.Register((index,oldName, newName) =>{print("replace:" + index + "," + oldName + "," + newName);ContentRoot.GetChild(index).GetComponent<Text>().text = newName;}).UnRegisterWhenGameObjectDestroyed(gameObject);mNameList.OnClear.Register(() =>{print("clear");ContentRoot.DestroyChildren();}).UnRegisterWhenGameObjectDestroyed(gameObject);}private string mNameToRemove = null;private void OnGUI(){IMGUIHelper.SetDesignResolution(640,360);GUILayout.Label("count:" + mNameList.Count);GUILayout.BeginVertical("box");foreach (var nameItem in mNameList){GUILayout.BeginHorizontal("box");GUILayout.Label(nameItem);if (GUILayout.Button("-")){mNameToRemove = nameItem;}GUILayout.EndHorizontal();}if (mNameToRemove.IsNotNullAndEmpty()){mNameList.Remove(mNameToRemove);mNameToRemove = null;}GUILayout.EndVertical();if (GUILayout.Button("add")){mNameList.Add("liangxie" + UnityEngine.Random.Range(0,100));}if (mNameList.Count > 0){if (GUILayout.Button("remove at 0")){mNameList.RemoveAt(0);}if (GUILayout.Button("replace at 0")){mNameList[0] = "replaced name" + UnityEngine.Random.Range(0, 100);}if (mNameList.Count > 1){if (GUILayout.Button("move 0 -> 1")){mNameList.Move(0, 1);}}if (GUILayout.Button("clear")){mNameList.Clear();}}}}
}
运行结果如下:
本文由 《QFramework 教程年会员》赞助,298 元,9 套教程一年内随便看。