2011-04-12 6 views
15

J'ai une ObservableCollection, où MyData est une classe avec 4 propriétés, c'est-à-dire int id, string name, bool IsSelected, chaîne IsVisible.Trier ObservableCollection - Quelle est la meilleure approche?

Cette ObservableCollection est liée à une zone de liste déroulante avec des cases à cocher (données Cities par exemple). Maintenant, lorsque l'utilisateur coche les cases à cocher, la prochaine fois qu'il ouvrira la liste déroulante, toutes les sélections devraient apparaître en ordre croissant par nom.

J'ai également mis en œuvre l'auto-complétion lorsque l'utilisateur tape 3 caractères dans la liste déroulante, le menu déroulant s'ouvrira en affichant toutes les sélections en premier, puis tous les éléments en commençant par les 3 caractères.

J'ai fait des recherches et mis en œuvre le code suivant et il fonctionne très bien, mais je veux savoir si c'est la meilleure approche ou puis-je mettre en œuvre ce une meilleure façon, le code est:

 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; 

Merci à l'avance pour votre temps!

Répondre

23

ICollectionView semble être un ajustement parfait pour cela. Il a été conçu spécifiquement pour trier, filtrer et regrouper une collection sans modifier la collection originale.

Vous pouvez obtenir une instance de ICollectionView pour votre collection en utilisant le code suivant:

var sortedCities = CollectionViewSource.GetDefaultView(City); 

Ensuite, vous pouvez configurer le tri en ajoutant des instances de SortDescription de type à la collection ICollectionView.SortDescriptions:

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

Ensuite, vous pouvez lier votre ComboBox directement à la vue de la collection (au lieu de la collection City) et il affichera les données déjà triées.

+1

Si vous triez la vue par défaut, la liaison à la collection City devrait vous donner des résultats triés. Lors de la liaison à une collection, WPF se lie à sa vue par défaut. – Goran

+2

@Goran - Oui, je le sais. Mais je pense qu'il vaut mieux être explicite. –

+0

Merci Pavlo! –

Questions connexes