Привязать к отсортированной коллекции ObservableCollection в ListBox

У меня есть список объектов данных в моем приложении Windows Phone 7, который называется MyObjectList , который наследует ObservableCollection < MyObject> . Я храню список в памяти в открытом свойстве приложения под названием MyObjects . Моя цель - связать данные с ListBox и отсортировать по MyObject.Name .

В настоящее время у меня есть ListBox в XAML с имя MyObjectsList и следующий код в конструкторе, чтобы связать его:

public MyObjectListView()
{
    InitializeComponent();
    this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects;
}

Это прекрасно работает. Я добавляю элементы в MyObjects , и они отображаются в ListBox . Однако данные не сортируются по имени, когда они появляются в списке. Я попробовал следующее изменение, чтобы получить данные для сортировки:

this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects
                                         .OrderBy(x => x.Name)

Но когда я это делаю, я не вижу объектов , отраженных в ListBox , отсортированных или иным образом.

Что можно сделать, чтобы при добавлении элемента в мою коллекцию ObservableCollection он был отсортирован по .Name в списке ListBox ?

8
задан akjoshi 29 May 2012 в 06:21
поделиться

4 ответа

Вы можете использовать отсортированную коллекцию вместо стандартной ObservableCollection . Кто-то написал SortedObservableCollection здесь:

http://phillters.wordpress.com/2009/05/14/sortedobservablecollection/

4
ответ дан 5 December 2019 в 10:38
поделиться

Это не поможет вам для Silverlight, но для WPF 3.5/4 есть лучший способ сделать это с помощью CollectionView

1
ответ дан 5 December 2019 в 10:38
поделиться

Проблема с вашим примером заключается в том, что метод OrderBy возвращает Тип объекта IOrderedEnumerable вместо ObservableCollection.

Вот кое-что, что вы можете сделать без реализации настраиваемой коллекции, как некоторые другие ответы.

var sortedMyObjects = new ObservableCollection<MyObject>();
foreach (var myobj in ((App)App.Current).MyObjects.Orderby(x => x.Name))
    sortedMyObjects.Add(myobj);
this.MyObjectsList.ItemsSource = sortedMyObjects;

Все остальные ответы предлагают жизнеспособные альтернативы, но это решит проблему в вопросе.

FWIW, в Silverlight 4 есть PagedCollectionView, но Silverlight в Windows Phone 7 основан на Silverlight 3, и он недоступен. Я упоминаю об этом только для того, чтобы вы знали об этом в ожидании обновления WP7 до SL4.

11
ответ дан 5 December 2019 в 10:38
поделиться

Посмотрите на http://mokosh.co.uk/post/2009/08/04/how-to- sort-observablecollection/.

В нем объясняется, как расширить ObservableCollection, чтобы предоставить базовый метод Items.Sort(), а затем уведомить слушателей об изменении коллекции.

Кроме того, Это сообщение здесь.. может помочь вам в этом. Он использует CollectionView.

0
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: