Привязать к отсортированной коллекции ObservableCollection <T>в ListBox - PullRequest
8 голосов
/ 24 августа 2010

В моем приложении для Windows Phone 7 есть список объектов данных с именем MyObjectList, который наследует ObservableCollection<MyObject>.Я храню список в памяти в открытом свойстве App, которое называется 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?

Ответы [ 4 ]

11 голосов
/ 24 августа 2010

Проблема с вашим примером заключается в том, что метод 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.

4 голосов
/ 24 августа 2010

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

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

1 голос
/ 24 августа 2010

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

0 голосов
/ 24 августа 2010

Взгляните на http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/.

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

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

...