2009-10-22 7 views
3

Dans mon fichier XAML, j'ai une ListBox déclarée comme ceci:WPF ListBox: problème avec la sélection

  <ListBox x:Name="lstDeck" Height="280" ItemsSource="{Binding Path=Deck}" > 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <ListBoxItem Content="{Binding}" /> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Dans mon modèle de vue, le pont est un ObservableCollection, de sorte que la liaison affiche directement le contenu de ma collection.

Mais quand j'ai plusieurs valeurs qui contiennent la même valeur (par exemple "10" six fois), la sélection dans le ListBox a un comportement bizarre: elle sélectionne 2-3 éléments au lieu du seul sur lequel J'ai cliqué.

De plus, lorsque je clique sur un autre objet ListBoxItem, il ne fait pas de focus sur le précédent sélectionné.

Ensuite, il est impossible de voir quel élément est réellement sélectionné, et impossible d'obtenir la valeur SelectedIndex.

Quelqu'un a une idée?

+0

Est-ce que vous définissez SelectionMode? – Sauron

+0

oui, je l'utilise mis à – KiTe

Répondre

8

Le problème est que la zone de liste ne peut pas distinguer entre les différentes valeurs. Par conséquent, une fois que vous cliquez sur l'un des «10», il définit la propriété SelectedItem et met à jour sa présentation. Parce qu'il ne peut pas distinguer entre les types de valeur, il marque chaque "10" comme sélectionné.

Mais pourquoi avez-vous "10" plusieurs fois dans votre liste? Si c'est juste la valeur numérique 10 ou la chaîne "10" cela n'a aucun sens pour moi.

Si vous avez un modèle plus complexe derrière cela et que vous venez d'afficher une propriété, vous devez lier le modèle complexe et définir le DisplayMemberPath à la place.

C#

public class Model 
{ 
    public Guid Id { get; set; } 
    public string Value { get; set; } 
} 

XAML

<ListBox ItemsSource="{Binding Path=Models}" DisplayMemberPath="Value" /> 

<ListBox ItemsSource="{Binding Path=Models}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Value}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Cordialement
Oliver Hanappi

+0

unique, il affiche le numéro 10, mais ce n'est qu'un exemple. en pratique, j'ai une liste qui affiche une collection de cartes de jeu, et une autre qui affiche les ID de ces cartes ajoutées à un jeu. Puisqu'il est possible d'avoir 3-4 fois la même carte, il est possible d'avoir plusieurs fois la même valeur. Voici mon problème. – KiTe

+2

Je vois votre problème. Transformez votre structure de carte en classe. Ainsi, l'utilisateur verra deux fois la même carte mais, en interne, elle ne sera pas la même (égalité de référence contre égalité de valeur). Assurez-vous que vous ne remplacez pas la méthode Equals et GetHashCode d'une manière qui implémente l'égalité des valeurs. –

+0

Oliver a raison. Votre liste utilise le numéro "10" comme clé pour vos objets. Puisque vous avez plusieurs "10", tous sont sélectionnés. Vous devez avoir quelque chose pour les distinguer, d'où l'objet qu'il a suggéré ci-dessus. –