// In PageManager we track selection by keeping track of the package unique ids (hence it's not affected by reordering) // In ListView, the selection is tracked by indices. As a result, when we update the itemsSource, we want to sync selection index if needed // Because there might be some sort of reordering private void SyncPageManagerSelectionToListView(PageSelection selection = null) { var visualStates = itemsSource as List <VisualState>; if (visualStates == null) { return; } var page = m_PageManager.GetCurrentPage(); if (page.tab != PackageFilterTab.AssetStore) { return; } selection ??= page.GetSelection(); var oldSelectedVisualStates = selectedItems.Select(item => item as VisualState).ToArray(); if (oldSelectedVisualStates.Length == selection.Count && oldSelectedVisualStates.All(v => selection.Contains(v.packageUniqueId))) { return; } var newSelectionIndices = new List <int>(); for (var i = 0; i < visualStates.Count; i++) { if (selection.Contains(visualStates[i].packageUniqueId)) { newSelectionIndices.Add(i); } } SetSelection(newSelectionIndices); }
private void OnSelectionChanged(PageSelection selection) { var currentView = this.currentView; foreach (var item in selection.previousSelections.Where(s => !selection.Contains(s.packageUniqueId)).Concat(selection)) { currentView.GetPackageItem(item.packageUniqueId)?.RefreshSelection(); } }