2010-02-24 3 views
4

Je déboguais un programme de collègues et j'ai rencontré ce problème dans WPF.WPF Listbox.selecteditems renvoie les éléments dans l'ordre où ils ont été sélectionnés

Il semble que listBoxName.SelectedItems renvoie une liste d'éléments sélectionnés, dans l'ordre dans lequel un utilisateur sélectionne l'élément dans l'interface. C'est un problème car je dois préserver l'ordre réel des objets.

Exemple:

la zone de liste est en selectmode prolongée et mon listbox contient quelque chose: RunFirst, runsecond, runthird

l'utilisateur reçoit une option pour sélectionner ce qu'ils souhaitent exécuter en fonction de la zone de liste. Ils sélectionnent runthird puis runfirst. Cela fait apparaître runthird en haut de la liste, puis runfirst. Je suppose que je pourrais trier la liste avant de courir un foreach mais je me demandais s'il y a un moyen plus facile.

Merci

+0

Je pense vous avez raison, mais vous devez trier la liste qui remplit la ListBox, puis trier les SelectedItems avant le traitement. – Dave

Répondre

3

Ouais, je fini par itérer sur tous les éléments de la dans la zone de liste, puis vérifié si elle était en selectedItems utilisant contient comme ci-dessous

  foreach (<yourobject> item in listForSelection.Items) 
      { 
       if (listForSelection.SelectedItems.Contains(item)) 
       { 
        \\code here 
       } 
      } 

Merci pour l'aide les gars

+0

Peut-être lente si vous avez une énorme quantité d'articles, mais seulement quelques-uns sélectionnés. –

1

Je pense que vous avez donné la réponse à votre question.

La plupart du temps, l'ordre des articles sélectionnés n'aura pas d'importance. Comme c'est le cas pour vous, le tri des éléments sélectionnés avant de les traiter semble être la solution la plus simple. Je ne peux pas vraiment penser à un plus simple, surtout quand le tri ne devrait ajouter qu'une ligne.

Vous pouvez utiliser le même Comparison<T> ou IComparer<T> qui a été utilisé pour trier la liste d'origine. Si vous liez SelectedItems, vous pouvez utiliser un IValueConverter pour effectuer le tri.

+0

J'ai pris vos conseils sur le tri – Locke12

9

Ce que j'ai fait était d'utiliser LINQ pour retourner les éléments sélectionnés dans l'ordre de l'index. C'est dans la syntaxe VB.Net, mais il devrait être facile de réparer C#.

Dim selecteditems = From selecteditem As ListBoxItem In ListBox1.SelectedItems _ 
        Select selecteditem _ 
        Order By ListBox1.Items.IndexOf(selecteditem) 
+0

L'utilisation du lien aurait probablement aussi bien fonctionné – Locke12

Questions connexes