Привязать ListView к списку с привязкой времени выполнения
Версия: 6000.0+
Управление ListView является самым эффективным способом создания списков. В этом примере показано, как использовать привязку времени выполнения для привязки ListView к списку без кода C#.
Примерный обзор
В этом примере создаётся объект GameSwitchListAsset ScriptableObject, содержащий список объектов GameSwitch. Каждый объект GameSwitch имеет два свойства: enabled и name. ListView отображает список переключателей и текстовых полей, которые связаны со свойствами enabled и name каждого объекта GameSwitch.
Вы можете найти завершенные файлы, созданные этим примером, в хранилище GitHub.
Предварительные условия
Это руководство предназначено для разработчиков, знакомых со скриптами Unity Editor, UI Toolkit и C#. Перед началом работы ознакомьтесь со следующим:
Создание объекта со списком
Создание структуры данных, содержащей элементы списка.
- Создайте проект Unity с любым шаблоном.
- В окне Project создайте скрипт C# с именем
GameSwitchListAsset.csсо следующим содержанием:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
[CreateAssetMenu(fileName = "GameSwitchListAsset.asset", menuName = "GameSwitchListAsset")]
public class GameSwitchListAsset : ScriptableObject
{
public List<GameSwitch> switches = new();
public void Reset()
{
switches = new List<GameSwitch>{
new() { name = "Use Local Server", enabled = false },
new() { name = "Show Debug Menu", enabled = false },
new() { name = "Show FPS Counter", enabled = true },
};
}
public bool IsSwitchEnabled(string switchName) => switches.Find(s => s.name == switchName).enabled;
[Serializable]
public struct GameSwitch
{
public bool enabled;
public string name;
}
}
Создание шаблона элемента ListView в UI Builder
Создайте шаблон для многократного использования, который определяет, как будет выглядеть и вести себя каждый элемент списка. ListView использует этот шаблон для создания визуальных элементов для каждого элемента данных. Подход шаблона эффективный потому, что:
- Одно определение шаблона работает для любого количества элементов списка
- UI Toolkit может рециклировать визуальные элементы, когда пользователи прокручивается
- Изменения в шаблоне автоматически применяются ко всем элементам
Каждый элемент содержит Toggle для состояния включённости и TextField для имени. Вы привязываете эти элементы UI к соответствующим свойствам объекта GameSwitch.
Создайте файл UXML с именем
ListViewItem.uxml.Дважды щелкните файл
ListViewItem.uxml, чтобы открыть его в UI Builder.В панели Hierarchy добавьте VisualElement.
Добавить Переключить в качестве дочернего VisualElement.
Добавить TextField в качестве дочернего VisualElement.
Удалить текст метки для Переключить и TextField.
Установить направление Flex из VisualElement в
Row.В панели Inspector переключателя Переключитьвыполните следующие действия:
Щелкните правой кнопкой мыши Значение и выберите Добавить привязку.
В окне Добавить Привязку установите Путь Источника Данных на
enabled.Установите Режим Привязки на
Two Way. Это гарантирует, что изменения в Toggle обновят источник данных, а изменения в источнике данных обновят Toggle.-
В течение Inspector группы экспертов TextField, выполните следующие действия:
- Щелкните правой кнопкой мыши Значение и выберите Добавить привязку.
- В окне Добавить Привязку установите Путь Источника Данных на
name. - Установите режим привязки с на
Two Way. Это гарантирует, что изменения в TextField обновят источник данных, а изменения в источнике данных обновят TextField.
Сохраните файл UXML. Готовый файл UXML выглядит следующим образом:
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:VisualElement name="" style="flex-direction: row;">
<ui:Toggle>
<Bindings>
<ui:DataBinding property="value" data-source-path="enabled" binding-mode="TwoWay"/>
</Bindings>
</ui:Toggle>
<ui:TextField placeholder-text="filler text">
<Bindings>
<ui:DataBinding property="value" data-source-path="name" binding-mode="TwoWay"/>
</Bindings>
</ui:TextField>
</ui:VisualElement>
</ui:UXML>
Создать ListView UI в UI Builder
Создайте ассет, содержащий список элементов, и создайте главный UI, на котором размещается ListView. На этом шаге настраивается подключение ListView к данным и определяются возможности взаимодействия с пользователями.
В меню выберите Ассеты > Создать > UIToolkitExamples > GameSwitchList. Это создаст ассет с именем GameSwitchListAsset.
Создайте файл UXML с именем
UIListView.uxml.Дважды щелкните файл
UIListView.uxml, чтобы открыть его в UI Builder.В панели Hierarchy добавьте ListView.
В течение Inspector группы экспертов ListView, настройте следующие параметры:
Источник данных: Выберите GameSwitchListAsset.asset. Это устанавливает тип объекта, который ListView ожидает получить в качестве источника данных.
Режим выбора источника привязки: Установите на Авто Назначение. Это говорит системе привязки автоматически определять правильный контекст данных для каждого элемента списка. При отображении шаблонов элементов каждый шаблон получает соответствующий объект
GameSwitchв качестве источника привязки.Шаблон элемента: установить на
ListViewItem.uxml.Show Add Remove Footers: Включите эту опцию, чтобы позволить пользователям добавлять или удалять элементы из списка.
Режим переупорядочивания: Настроить на Анимированный для включения переупорядочивания с помощью перетаскивания.
Сохраните файл UXML.
Установите привязку itemsSource в UXML
Последним важным шагом является подключение свойств itemsSource ListView к вашим данным. itemsSource определяет, какую коллекцию объектов отображает ListView. В этом случае, список switches из вашего GameSwitchListAsset.
Это свойство не подвергается в UI Builder’s Inspector. Вам нужно вручную отредактировать UXML добавить эту связь. itemsSource связывание — это то, что делает ListView заполнить ваши фактические элементы данных.
Чтобы создать эту привязку, добавьте тег <Bindings> внутрь <ui:ListView>:
<ui:ListView>
<Bindings>
<ui:DataBinding property="itemsSource" data-source-path="switches" />
</Bindings>
</ui:ListView>
Примечание: В этом примере устанавливается itemsSource в UXML Вы также можете настроить подключение к источнику данных в вашем C# скрипт выглядит так:
var listView = rootVisualElement.Q<ListView>();
var gameSwitchListAsset = /* obtain reference to your GameSwitchListAsset instance */;
listView.dataSource = gameSwitchListAsset;
Завершенный файл UIListView.uxml выглядит следующим образом:
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:ListView binding-source-selection-mode="AutoAssign" item-template="ListViewItem.uxml" data-source="GameSwitchListAsset.asset" show-foldout-header="true" virtualization-method="DynamicHeight" show-border="false" reorderable="true" horizontal-scrolling="false" selection-type="Single" reorder-mode="Animated" show-add-remove-footer="true">
<Bindings>
<ui:DataBinding property="itemsSource" data-source-path="switches"/>
</Bindings>
</ui:ListView>
</ui:UXML>
Примечание: В вашем UXML файл, убедитесь, что удалить engine="UnityEngine.UIElements" и editor="UnityEditor.UIElements" атрибуты из <ui:UXML> эти атрибуты устанавливают пространство имен по умолчанию, которое нарушает <Bindings> метка потому что Bindings это не тип, а поле.
Проверка привязки в сцене
Проверьте всю систему целиком, чтобы увидеть, как привязки времени выполнения создают динамический интерактивный интерфейс.
- В примерной сцене выберите GameObject > UI Toolkit > UI Документ, чтобы добавить Документ UI.
- В панели Inspector компонента UI Документ установите Источник Актива на
UIListView.uxml. - Перейдите в режим воспроизведения. ListView отображает список объектов
GameSwitchизGameSwitchListAsset. Вы можете взаимодействовать с переключателями и текстовыми полями, добавлять или удалять элементы и переупорядочивать список. Все изменения отражаются в базовом источнике данных и наоборот.