版本:Unity 6 (6000.0)
语言:英语
创建自定义绑定以绑定 USS 选择器
SerializedObject 数据绑定

使用运行时绑定将 ListView 绑定到列表

版本: 6000+

ListView 控件是创建列表最有效的方式。此示例演示如何使用运行时绑定将 ListView 绑定到列表。运行时绑定支持运行时和编辑器 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三个 UI 系统。 更多信息
查看 术语表
。为了演示目的,此示例在编辑器窗口中显示 ListView。

示例概述

此示例创建一个 ListView 和一个列表。要将 ListView 绑定到列表,请将 ListView 的绑定数据源设置为包含列表的属性。

您可以在此 GitHub 存储库 中找到此示例创建的完整文件。

先决条件

本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容

创建一个包含列表的对象

创建一个包含 Item 对象列表的示例 List 对象。每个 Item 包含一个 name 和一个 enabled 属性。

  1. 使用任何模板创建一个 Unity 项目。
  2. 在您的 项目 窗口中,创建一个名为 runtime-binding-listview 的文件夹,用于存储所有文件。
  3. runtime-binding-listview 文件夹中,创建一个名为 Scripts 的文件夹,用于存储所有 C# 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间推移修改组件属性,并以任何您喜欢的方式响应用户输入。 更多信息
    查看 术语表
  4. Scripts 文件夹中,创建一个名为 ExampleItemObject.cs 的 C# 脚本,内容如下
   using System;
   using System.Collections.Generic;
   using UnityEngine;
   
   public class ExampleItemObject  
   {
       public List<Item> items = new();
   
       public void Reset()
       {
           items = new List<Item>{
               new() { name = "Use Local Serverdfsdfsd", enabled = false },
               new() { name = "Show Debug Menu", enabled = false },
               new() { name = "Show FPS Counter", enabled = true },
           };
       }
   
       // Use a struct instead of a class to ensure that the ListView can create items 
       // when the + button is clicked.
       public struct Item
       {
           public bool enabled;
           public string name;
       }
   }

在 UI 生成器中创建 ListView 项目模板

在 UI 生成器中创建列表项目的模板。每个项目包含一个 Toggle 和一个 TextField。将它们绑定到 Item 对象的 enabledname 属性。

  1. runtime-binding-listview 文件夹中,创建一个名为 UXML 的文件夹。

  2. UXML 文件夹中,创建一个名为 ListViewItem.uxml 的 UXML 文件。

  3. 双击 ListViewItem.uxml 文件,在 UI 生成器中打开它。

  4. 层次结构 面板中,添加一个 VisualElement

  5. 将一个 Toggle 作为 VisualElement 的子元素添加。

  6. 将一个 TextField 作为 VisualElement 的子元素添加。

  7. 删除 ToggleTextField 的标签文本。

  8. VisualElementFlex 方向 设置为 Row

  9. 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
    查看 术语表
    面板的 Toggle 中,执行以下操作

  10. 右键单击 ,然后选择 添加绑定

  11. 添加绑定 窗口中,将 数据源路径 设置为 enabled

  12. 检查器 面板的 TextField 中,执行以下操作

    • 右键单击 ,然后选择 添加绑定
    • 添加绑定 窗口中,将 数据源路径 设置为 name
  13. 保存 UXML 文件。完成后的 UXML 文件如下所示

   <ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
       <ui:VisualElement name="VisualElement" style="flex-direction: row;">
           <ui:Toggle>
               <Bindings>
                   <ui:DataBinding property="value" data-source-path="enabled"  />
               </Bindings>
           </ui:Toggle>
           <ui:TextField placeholder-text="filler text">
               <Bindings>
                   <ui:DataBinding property="value" data-source-path="name"  />
               </Bindings>
           </ui:TextField>
       </ui:VisualElement>
   </ui:UXML>

在 UI 生成器中创建 ListView UI

在 UI 生成器中创建 ListView UI,并将项目模板设置为 ListViewItem.uxml

  1. UXML 文件夹中,创建一个名为 UIListView.uxml 的 UXML 文件。

  2. 双击 UIListView.uxml 文件,在 UI 生成器中打开它。

  3. 层次结构 面板中,添加一个 ListView

  4. 检查器 面板的 ListView 中,执行以下操作

  5. 虚拟化方法 设置为 动态高度

  6. 重新排序模式 设置为 动画

  7. 项目模板 设置为 ListViewItem.uxml

  8. 绑定源选择模式 设置为 自动分配

  9. 选中 可重新排序 复选框。

  10. 选中 显示添加删除页脚 复选框。

  11. 标题 设置为 Items

  12. 选中 显示展开标题 复选框。

  13. 保存 UXML 文件。完成后的 UXML 文件如下所示

   <ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns="UnityEngine.UIElements" ue="UnityEditor.UIElements" editor-extension-mode="False">
       <ui:ListView virtualization-method="DynamicHeight" reorder-mode="Animated" binding-source-selection-mode="AutoAssign" show-add-remove-footer="true" header-title="Items" reorderable="true" show-border="false" show-foldout-header="true" item-template="ListViewItem.uxml" show-bound-collection-size="false" />
   </ui:UXML>

创建一个自定义编辑器窗口并设置绑定

创建一个包含 ListView 的自定义编辑器窗口,并将其绑定到 Listitems 属性。此示例在 C# 脚本中设置绑定源。您也可以在 ListView 元素内的 UXML 文件中手动设置绑定源,例如

<ui:ListView>
    <Bindings>
        <ui:DataBinding property="itemsSource" data-source-path="items" />
    </Bindings>
</ui:ListView>
  1. Scripts 文件夹中,创建一个名为 Editor 的文件夹。
  2. Editor 文件夹中,创建一个名为 ListViewTestWindow.cs 的 C# 脚本,内容如下
   using UnityEngine;
   using UnityEngine.UIElements;
   using UnityEditor;
   using UnityEditor.UIElements;
   using System.Collections.Generic;
   using Unity.Properties;
   
   internal class ListViewTestWindow : EditorWindow
   {
       [SerializeField] private VisualTreeAsset itemLayout;
       [SerializeField] private VisualTreeAsset editorLayout;
   
       ExampleItemObject m_ExampleItemObject;
       
       [MenuItem("Window/ListViewTestWindow")]
       static void Init()
       {
           ListViewTestWindow window = EditorWindow.GetWindow<ListViewTestWindow>();
           window.Show();
       }
   
       void CreateGUI()
       {
           m_ExampleItemObject = new();
   
           editorLayout.CloneTree(rootVisualElement);
           var listView = rootVisualElement.Q<ListView>();
           
           // This example sets the itemTemplate and bindingSourceSelectionMode in the UXML file.
           // You can also set them in the C# script like the following:
           //listView.itemTemplate = itemLayout;
           //listView.bindingSourceSelectionMode = BindingSourceSelectionMode.AutoAssign;
   
           // Set the binding source to the ExampleItemObject instance.
           listView.dataSource = m_ExampleItemObject;
   
           // Set the itemsSource binding to the items property of the List object.
           listView.SetBinding("itemsSource", new DataBinding() {dataSourcePath = new PropertyPath("items")});
           
           m_ExampleItemObject.Reset();
       }
   }
   

测试绑定

  • 从菜单中选择 窗口 > ListViewTestWindow

编辑器窗口显示一个绑定到 ExampleItemObject.cs 中定义的项目的 ListView。如果您更新 ExampleItemObject.csItemenabledname 属性的值,更改将自动反映在 ListView 中。

其他资源

创建自定义绑定以绑定 USS 选择器
SerializedObject 数据绑定