2012-06-30 10 views
7

Estoy vinculando ItemsControl a CollectionViewSource. Aquí está el código:CollectionViewSource no reordena en el cambio de propiedad

this.Trucks = new ObservableCollection<Truck>(); 
      foreach (var truck in DataRepository.Trucks.Where(t => t.ReadyDate.Date.Equals(this.Date))) 
      { 
       this.Trucks.Add(truck); 
      } 

      this.TrucksSource = new CollectionViewSource { Source = this.Trucks }; 
      this.TrucksSource.SortDescriptions.Add(new SortDescription("ReadyAddress.Region.RegionNumber", ListSortDirection.Ascending)); 
      this.TrucksSource.SortDescriptions.Add(new SortDescription("TruckId", ListSortDirection.Ascending)); 

Cuando inicialmente atasco - la clasificación funciona. Cuando agrego el elemento a ObservableCollection, se inserta en el lugar adecuado, eso es bueno. Pero cuando cambio la propiedad que clasifico, este elemento no se "desplaza" en una lista.

ReadyAddress.Region.RegionNumber plantea correctamente INotifyPropertyChanged y lo veo en los campos vinculados, pero el orden no cambia. ¿Espero algo que no debería suceder o hay una mejor manera de manejar esto?

+0

Consulte mi respuesta para [Ordenar descripción y actualización ordenada automática] (http://stackoverflow.com/a/7372522/620360). – LPL

+0

Hay una nueva característica en WPF 4.5 llamada live shaping que resuelve este problema, pero puede que tenga que usar el método vinculado por LPL por el momento si no desea llamar a Refresh. – Kris

+0

Pude arreglar esto simplemente llamando a PropertyChanged en la propiedad que expone la vista, permitiendo que la vista se actualice (y borre la clasificación) y luego agregue las descripciones de clasificación. – PatFromCanada

Respuesta

5

todas las respuestas que encontré mencionan View.Refresh() pero eso no es muy buena solución para grandes listas. Lo que terminé haciendo fue a Remove() y Add() este artículo. Luego, se reposicionó correctamente sin volver a cargar toda la lista.

¡Palabra de advertencia! Funciona para lo que hago, pero en su caso, eliminar un objeto y volver a agregarlo puede causar efectos secundarios dependiendo de cómo se escriba su código. En mi caso, es una lista con efecto UI donde los nuevos elementos aparecen con la transición, por lo que refrescante mostrará la transición en toda la lista, donde eliminar/agregar muestra cómo se reposicionó el elemento get.

4

¿Ha intentado actualizar su collectionviewsource?

this.TruckSource.View.Refresh(); 
+3

Sí, pero no me gusta, refresca toda la vista – katit

Cuestiones relacionadas