2010-08-24 6 views
8

Tengo una lista de objetos de datos en mi aplicación Windows Phone 7 llamada MyObjectList, que hereda ObservableCollection<MyObject>. Guardo la lista en la memoria en una propiedad pública de App llamada MyObjects. Mi objetivo es vincular los datos a un ListBox y ordenarlos por MyObject.Name.Enlace a una ordenada ObservableCollection <T> en un ListBox

Actualmente, tengo un ListBox en XAML con el nombre MyObjectsList y el siguiente código en el constructor para vincularlo:

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

Esto funciona muy bien. Agregué artículos al MyObjects y aparecen en el ListBox. Sin embargo, los datos no están ordenados por nombre cuando aparece en la lista. Probé el siguiente cambio para obtener los datos que se clasifican:

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

Pero cuando hago eso, no veo ningún objetos reflejados en el ListBox ordenados o de otra manera.

¿Qué puedo hacer para que cuando agregue un artículo a mi ObservableCollection, aparezca ordenado por .Name en el ListBox?

+4

El uso de Linq en ItemsSource deshabilitará el bit 'Observable' de ObservableCollection –

Respuesta

0

Eche un vistazo a http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/.

Explica cómo extender ObservableCollection para exponer el método Items.Sort() subyacente y luego notificar a los oyentes que la colección ha cambiado.

Además, This Post here.. podría ayudarlo con eso. Utiliza CollectionView.

+0

El primer enlace al que hizo referencia apuntó a un gran artículo sobre el uso de ''. Una vez que descubrí los espacios de nombres correctos para usar (siempre un desafío con XAML), funcionó perfectamente. ¡Gracias! –

+0

El primer enlace parece estar muerto – vwegert

4

Puede utilizar una colección ordenada en lugar de su estándar ObservableCollection. Alguien escribió una SortedObservableCollection aquí:

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

+0

Esta implementación es realmente mala ya que tiene una inserción O (n) en una colección ordenada. Definitivamente me desaconsejo. – Benlitz

+0

No creo que nadie tenga una colección lo suficientemente grande como para que O (n) sea un problema. – roim

1

Esto no le ayuda para Silverlight, pero para WPF 3.5/4, hay una mejor manera de hacer esto implica CollectionView

11

El problema con su ejemplo, el método OrderBy devuelve un tipo de objeto IOrderedEnumerable en lugar de un ObservableCollection.

Aquí hay algo que puede hacer sin implementar una colección personalizada como algunas de las otras respuestas.

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

Las otras respuestas sugieren alternativas viables, pero esto resolverá el problema en la pregunta.

FWIW, en Silverlight 4 hay un PagedCollectionView, pero Silverlight de Windows Phone 7 está basado en Silverlight 3 y no está disponible. Solo lo menciono para mantenerlo al tanto de que WP7 eventualmente se actualice a SL4.

+0

¡Esto funcionó asombrosamente para mí! Convirtiendo todo mi código para aprovechar esto. – pearcewg

+0

Gran solución. – peterept

Cuestiones relacionadas