2010-08-11 6 views
1

J'ai une zone de liste liée à une collection. Je voudrais que le ListBox inverse toujours l'ordre des articles. Ce gestionnaire - branché à l'événement de chargement du contrôle - fonctionne pour la charge initiale, mais pas par la suite. J'ai essayé d'utiliser l'événement SourceUpdated mais cela ne semble pas fonctionner. Comment puis-je maintenir un tri actif constant?Comment conserver une liste liée aux données triée par ordre inverse

MyList.Items.SortDescriptions.Add(New SortDescription("Content", ListSortDirection.Descending)) 

Répondre

0

Comment la collection stockée qui fournit les éléments pour la zone de liste? Ce devrait être une collection qui supporte INotifyCollectionChanged. Le cadre fournit ObservableCollection<T> que vous pouvez utiliser.

Dans le constructeur de votre ViewModel (ou là où vit la collection), vous obtenez le DefaultView pour ajouter le SortDescription. Le CollectionView est comme une couche au-dessus de votre collection, que vous pouvez utiliser pour trier, grouper, filtrer, etc. les éléments sans réellement affecter la source de données sous-jacente. Le cadre crée un cadre par défaut pour vous. Pour obtenir une référence, vous pouvez utiliser un code similaire à ce qui suit:

 var collectionView = CollectionViewSource.GetDefaultView(Widgets); 
     if(collectionView == null) 
      return; 

     collectionView.SortDescriptions.Add(new SortDescription("Content", ListSortDirection.Descending)); 

Avec cela en place, vous devriez être en mesure d'ajouter des éléments à la ObservableCollection<T> et l'ordre de tri sera maintenue.

+0

Je pense que nous avons un bug dans notre contrôle esri. La collection de calques est une ObservableCollection mais elle n'implémente pas correctement INotifyCollectionChanged. – Douglas

+0

Je suppose que vous pourriez essayer de remplacer votre contrôle par un ObservableCollection de vanille et voir si le problème disparaît. Si oui, alors il semble qu'il pourrait y avoir un problème avec votre contrôle esri. –

0

Si votre collection de source est un List<T> ou d'une autre collection qui n'implémente pas INotifyCollectionChanged, il n'y a aucun moyen WPF peut détecter lorsqu'un élément est ajouté. Vous devez utiliser une collection qui implémente INotifyCollectionChanged, comme ObservableCollection<T>.

En outre, les éléments de votre collection doivent mettre en œuvre INotifyCollectionChanged afin que les modifications aux éléments sont pris en compte