using System; using System.Collections.Generic; using System.Linq; using UnityEngine.UIElements; namespace AlicizaX.PackageManager.Editor { internal class PackageListView : ListView { public event Action> OnSelectionChangedEvent; private void OnSelectionChangedInternal(IEnumerable selectedItems) { // 转换对象类型为实际数据类型 var packages = selectedItems.Cast(); OnSelectionChangedEvent?.Invoke(packages); // 刷新列表项显示 RefreshItems(); } public PackageListView() { style.paddingTop = new Length(2, LengthUnit.Pixel); virtualizationMethod = CollectionVirtualizationMethod.FixedHeight; fixedItemHeight = 25f; horizontalScrollingEnabled = false; ScrollView scrollView = this.Q(); scrollView.horizontalScrollerVisibility = ScrollerVisibility.Hidden; style.flexShrink = 1; style.height = Length.Percent(95); makeItem = MakeItem; bindItem = BindItem; selectionChanged += OnSelectionChanged; selectionChanged += OnSelectionChangedInternal; selectionType = SelectionType.Single; } private void OnSelectionChanged(IEnumerable selectedItems) { RefreshItems(); } private VisualElement MakeItem() { return new PackageInfoListItem(); } private void BindItem(VisualElement item, int index) { if (!(item is PackageInfoListItem packageItem)) { return; } RepositoryPackageData packageData = GetVisualStateByIndex(index); packageItem.RefreshDataSource(packageData); // 绑定数据后更新选中状态 bool isSelected = selectedIndices.Contains(index); packageItem.SetSelected(isSelected); } private RepositoryPackageData GetVisualStateByIndex(int index) { return this.itemsSource is List itemsSource ? itemsSource.ElementAtOrDefault(index) : (RepositoryPackageData)null; } } }