Сортировка ObservableCollection - каков наилучший подход? - PullRequest
15 голосов
/ 12 апреля 2011

У меня есть ObservableCollection, где MyData - это класс с 4 свойствами, то есть int id, имя строки, bool IsSelected, строка IsVisible.

Эта ObservableCollection связана с полем со списком (например, данные городов),Теперь, когда пользователь устанавливает флажки, а затем в следующий раз, когда он открывает раскрывающийся список - все выборы должны идти сверху в порядке возрастания имени.

Я также реализовал автозаполнение, когда пользователь вводит 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 Ответ

23 голосов
/ 12 апреля 2011

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 collection), и он будет отображать уже отсортированные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...