У меня есть список объектов данных в моем приложении 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
?
Вы можете использовать отсортированную коллекцию вместо стандартной ObservableCollection
. Кто-то написал SortedObservableCollection
здесь:
http://phillters.wordpress.com/2009/05/14/sortedobservablecollection/
Это не поможет вам для Silverlight, но для WPF 3.5/4 есть лучший способ сделать это с помощью CollectionView
Проблема с вашим примером заключается в том, что метод 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.
Посмотрите на http://mokosh.co.uk/post/2009/08/04/how-to- sort-observablecollection/.
В нем объясняется, как расширить ObservableCollection, чтобы предоставить базовый метод Items.Sort(), а затем уведомить слушателей об изменении коллекции.
Кроме того, Это сообщение здесь.. может помочь вам в этом. Он использует CollectionView.