(Editor)UI Toolkit 与数据的连接
将面板与数据连接
以ListView做例子:
1.先声明还有呈现的模板
//拿到模板
private VisualTreeAsset itemRowTempLate;
//获得VisualElemwnt
private ListView itemListView;
2.再根据你自己创建的面板查找
//拿到模板数据
itemRowTempLate = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Editor/UI Builder/ItemRow Template.uxml");
//获得ListView
itemListView = root.Q<VisualElement>("ItemList").Q<ListView>("ListView");
//加载数据的函数方法
LoadDataBase();
//生成List View的函数方法
GenerateListView();
3.再将你自己需要呈现的赋值上去
//查找ItemDataList_SO
private void LoadDataBase()
{
var dataArray = AssetDatabase.FindAssets("ItemDataList_SO");
if (dataArray.Length > 1)
{
var path = AssetDatabase.GUIDToAssetPath(dataArray[0]);
dataBase = (ItemDataList_SO) AssetDatabase.LoadAssetAtPath(path, typeof(ItemDataList_SO));
}
itemList = dataBase.itemDetailsList;
//如果不标记就无法保存数据
EditorUtility.SetDirty(dataBase);
//Debug.Log(itemList[0].itemID);
}
//生成listView
private void GenerateListView()
{
Func<VisualElement> makeItem = () => itemRowTempLate.CloneTree();
Action<VisualElement, int> bindItem = (e, i) =>
{
if (i < itemList.Count)
{
if (itemList[i].itemIcon!=null)
e.Q<VisualElement>("Icon").style.backgroundImage = itemList[i].itemIcon.texture;
e.Q<Label>("Name").text = itemList[i] == null ? "NO ITEM" : itemList[i].itemName;
}
};
itemListView.fixedItemHeight = 60;
//将数据赋值给ListView
itemListView.itemsSource = itemList;
itemListView.makeItem = makeItem;
itemListView.bindItem = bindItem;
//itemListView.selectionType = SelectionType.Multiple;
}