2008-11-19 5 views
0

J'ai un contrôle ListBox que je veux changer pour avoir une sélection à bascule. Cliquez une fois sur un élément pour le sélectionner, cliquez à nouveau pour le désélectionner. En outre, en cliquant sur un autre élément de la liste devrait faire l'action par défaut de désélectionner l'élément précédent et en sélectionnant le nouveau.La meilleure façon de changer la sélection ListBox pour qu'elle soit une sélection à bascule

Quelle est la meilleure façon d'y parvenir?

Répondre

2

Ce que vous voulez est un RadioButtonList. Vous pouvez en créer un en créant un ItemDataTemplate et y placer un RadioButton. Ensuite, vous pouvez modifier le modèle du RadioButton pour qu'il ressemble à un bouton.

0

Je garderais le ListBox standard de cette façon, vous conserverez le comportement par défaut que vous voulez, puis pour désélectionner un élément, pourriez-vous le gérer dans l'événement de souris? dire utiliser quelque chose comme ceci:

Point newPoint = e.GetPosition(backgroundImage); 

HitTestResult result = VisualTreeHelper.HitTest(this, newPoint); 

if (result.VisualHit is ListBoxItem) 

Je ne suis pas sûr que ce soit la meilleure façon, la seule façon que j'irais à faire est de tirer mon propre ListBox de la fenêtre standard de contrôle et d'ajouter dans un propriété de dépendance pour me permettre de gérer la désélection dans le style. Si vous voulez adopter cette approche, je ne devrais pas supprimer le comportement par défaut que vous voulez conserver, j'ai utilisé cette approche pour créer un ListBox qui afficherait une image à côté du texte.

Si vous avez besoin de pointeurs pour commencer, alors donnez moi un cri.

0

J'ai réussi à réaliser cela moi-même en créant légèrement deux classes personnalisées, ToggleListBox & ToggleListBoxItem. Il y a quelques remplacements pratiques (le plus important dans ToggleListBox est celui qui crée votre ListBoxItem). De là, il était facile de gérer deux fois en cliquant sur le même élément ou en appuyant sur la touche espace/entrée. 40 lignes de code pour les deux classes et fonctionne bien.

0

Juste au cas où quelqu'un est intéressé, j'ai trouvé une solution différente à cela qui a fonctionné pour moi très bien. Je mis le ListBox.SelectionMode à Multiple et manié l'événement MouseDown ainsi:

EventManager.RegisterClassHandler(typeof(ListBoxItem), 
    ListBoxItem.MouseLeftButtonDownEvent, 
    new RoutedEventHandler(this.HandleListBox_MouseDown)); 

... 

void HandleListBox_MouseDown(object sender, RoutedEventArgs e) 
{ 
    var listBoxItem = (ListBoxItem)sender; 
    if (ShouldDeselectOtherListItems(listBoxItem)) 
    { 
     listBox.SelectedIndex = -1; 
    } 
} 

bool ShouldDeselectOtherListItems(ListBoxItem listBoxItem) 
{ 
    return !listBoxItem.IsSelected 
     && listBox.SelectedItems.Count > 0; 
} 

Où listBox est le contrôle ListBox parent. Il s'assure que tous les éléments de zone de liste sont désélectionnés avant de traiter les gestionnaires d'événements MouseDown du système, ce qui permet de basculer l'état de sélection du même élément de zone de liste.

Questions connexes