Сортировка ObservableCollection - каков наилучший подход?
У меня есть ObservableCollection, где MyData - это класс с 4 свойствами. i.e int id, имя строки, bool IsSelected, строка IsVisible.
Этот ObservableCollection привязан к combobox с флажками (например, данные о городах). Теперь, когда пользователь проверяет флажки, в следующий раз, когда он открывает раскрывающийся список - все выборы должны появляться сверху в порядке возрастания по имени.
Я также выполнил автоматическое завершение, когда пользователь набирает 3 символа в поле со списком, откроется раскрывающийся список, показывающий все варианты выбора, а затем все элементы, начиная с 3 символов, вводится пользователем.
Я исследовал и реализовал следующий код, и он работает нормально, но я хочу знать, является ли это лучшим подходом или я могу реализовать это лучше, код:
IEnumerable<MyData> sort;
ObservableCollection<MyData> tempSortedCities = new ObservableCollection<MyData>();
sort = City.OrderByDescending(item => item.IsSelected).ThenBy(item => item.Name.ToUpper()) ;
// City is my observablecollection<MyData> property in my Model binded to combobox in UI
foreach (var item in sort)
tempSortedCities.Add(item);
City.Clear(); // City is my observablecollection<MyData> property in my Model
City = tempSortedCities;
tempSortedCities = null;
sort = null;
Заранее благодарим за ваше время!
Ответы
Ответ 1
ICollectionView
, кажется, идеально подходит для этого. Он был разработан специально для сортировки, фильтрации и группировки коллекции без изменения оригинальной коллекции.
Вы можете получить экземпляр ICollectionView
для своей коллекции, используя следующий код:
var sortedCities = CollectionViewSource.GetDefaultView(City);
Затем вы можете настроить сортировку, добавив экземпляры типа SortDescription
в коллекцию ICollectionView.SortDescriptions
:
sortedCities.SortDescriptions.Add(new SortDescription("IsSelected", ListSortDirection.Descending));
sortedCities.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
Затем вы можете привязать ваш ComboBox
непосредственно к представлению коллекции (вместо коллекции City
), и он отобразит уже отсортированные данные.