2010-08-24 3 views
8

Ich habe eine Liste von Datenobjekten in meiner Windows Phone 7-Anwendung namens MyObjectList, die ObservableCollection<MyObject> erbt. Ich behalte die Liste im Speicher in einer öffentlichen Eigenschaft von App namens MyObjects. Mein Ziel ist es, die Daten an eine ListBox zu binden und sie nach MyObject.Name sortiert zu haben.An eine sortierte ObservableCollection binden <T> in einer ListBox

Derzeit habe ich ein ListBox in XAML mit dem Namen MyObjectsList und der folgende Code in dem Konstruktor es zu verknüpfen:

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

Dies funktioniert gut. Ich füge Artikel zu MyObjects hinzu und sie erscheinen in ListBox. Die Daten werden jedoch nicht nach Namen sortiert, wenn sie in der Liste angezeigt werden. Ich habe versucht, die folgende Änderung der Daten zu erhalten, sortiert werden:

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

Aber wenn ich das tue, sehe ich nicht irgendwelche Objekte in den ListBox reflektierten sortiert oder anderweitig.

Was kann ich tun, damit, wenn ich einen Artikel zu meinem ObservableCollection hinzufüge, er sich sortiert nach .Name im ListBox zeigt?

+4

Verwendung von Linq auf einer ItemsSource deaktiviert das "Observable" -Bit der ObservableCollection –

Antwort

0

Werfen Sie einen Blick auf http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/.

Es wird erläutert, wie ObservableCollection so erweitert wird, dass die zugrunde liegende Items.Sort() -Methode verfügbar gemacht wird, und Listener dann benachrichtigt werden, dass sich die Auflistung geändert hat.

Auch This Post here.. könnte Ihnen dabei helfen. Es verwendet CollectionView.

+0

Der erste Link, auf den Sie verwiesen haben, zeigte auf einen tollen Artikel über die Verwendung von ''. Sobald ich die richtigen Namespaces gefunden hatte (immer eine Herausforderung mit XAML), funktionierte es perfekt. Vielen Dank! –

+0

Die erste Verbindung scheint tot zu sein – vwegert

4

Sie könnten eine sortierte Sammlung anstelle Ihres Standards ObservableCollection verwenden. Jemand hat ein SortedObservableCollection hier:

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

+0

Diese Implementierung ist wirklich schlecht, da sie eine O (n) -Einfügung in einer sortierten Auflistung hat. Ich rate definitiv dagegen. – Benlitz

+0

Ich glaube nicht, dass irgendjemand eine Sammlung haben würde, die groß genug wäre, um O (n) ein Problem zu sein. – roim

1

Das ist nicht Ihnen für Silverlight hilft, aber für WPF 3.5/4, gibt es einen besseren Weg, dies CollectionView

11

Das Problem im Zusammenhang mit tun In Ihrem Beispiel gibt die OrderBy-Methode anstelle einer ObservableCollection einen IoberedEnumerable-Objekttyp zurück.

Hier ist etwas, was Sie tun können, ohne eine benutzerdefinierte Sammlung wie einige der anderen Antworten zu implementieren.

Die anderen Antworten alle vorschlagen brauchbare Alternativen, aber das wird das Problem in der Frage lösen.

FWIW, in Silverlight 4 gibt es eine PagedCollectionView, aber Silverlight von Windows Phone 7 basiert auf Silverlight 3 und das ist nicht verfügbar. Ich erwähne das nur, um Sie in Erwartung von WP7 auf SL4 aufmerksam zu machen.

+0

Das hat super funktioniert für mich! Konvertiere meinen gesamten Code, um dies zu nutzen. – pearcewg

+0

Große Lösung. – peterept

Verwandte Themen