2011-04-12 24 views
15

Tengo un ObservableCollection, donde MyData es una clase con 4 propiedades, es decir, int id, nombre de cadena, bool IsSelected, cadena IsVisible.Sort ObservableCollection: ¿cuál es el mejor enfoque?

Este ObservableCollection está vinculado a un combobox con casillas de verificación (datos de ciudades, por ejemplo). Ahora, cuando el usuario marque las casillas de verificación, la próxima vez que abra el menú desplegable, todas las selecciones deben aparecer en orden ascendente por su nombre.

También he implementado completa automático cuando el usuario escribe en 3 caracteres en el cuadro combinado, la caída hacia abajo se abrirán mostrando todas las selecciones en primer lugar, a continuación, a continuación, todos los elementos a partir de los 3 caracteres de tipo en el usuario.

He investigado y puesto en práctica el siguiente código y está funcionando muy bien, pero quiero saber si este es el mejor enfoque o puedo aplicar esto de una manera mejor, el código es:

 IEnumerable<MyData> sort; 
     ObservableCollection<MyData> tempSortedCities = new ObservableCollection<MyData>(); 
     sort = City.OrderByDescending(item => item.IsSelected).ThenBy(item => item.Name.ToUpper()) ; 
     // City is my observablecollection<MyData> property in my Model binded to combobox in UI 
     foreach (var item in sort) 
      tempSortedCities.Add(item); 


     City.Clear(); // City is my observablecollection<MyData> property in my Model 
     City = tempSortedCities; 
     tempSortedCities = null; 
     sort = null; 

Gracias de antemano por su tiempo!

Respuesta

23

ICollectionView parece ser una opción perfecta para esto. Fue diseñado específicamente para clasificar, filtrar y agrupar una colección sin modificar la colección original.

Usted puede obtener una instancia de ICollectionView para su colección usando el siguiente código:

var sortedCities = CollectionViewSource.GetDefaultView(City); 

A continuación, puede ordenar la configuración mediante la adición de casos de SortDescription tipo a la ICollectionView.SortDescriptions colección:

sortedCities.SortDescriptions.Add(new SortDescription("IsSelected", ListSortDirection.Descending)); 
sortedCities.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 

Entonces puede enlazar su ComboBox directamente a la vista de colección (en lugar de la colección City) y mostrará los datos ya ordenados.

+1

Si está ordenando la vista predeterminada, el enlace a la colección City debería proporcionarle resultados ordenados. Cuando se vincula a una colección, WPF se une a su vista predeterminada. – Goran

+2

@Goran - Sí, lo sé. Pero creo que es mejor ser explícito. –

+0

Gracias Pavlo! –

Cuestiones relacionadas