2008-09-24 5 views
18

J'ai une zone de liste où les articles contiennent des cases à cocher:WPF problème de sélection ListBoxItem

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Le problème que je vais avoir est que lorsque je clique sur la case à cocher ou de son contenu, le ListBoxItem parent ne soit pas sélectionné. Si je clique sur l'espace blanc à côté de la case à cocher, le ListBoxItem est sélectionné. Le comportement que j'essaie d'obtenir est de pouvoir sélectionner un ou plusieurs éléments dans la liste et d'utiliser la barre d'espace pour activer et désactiver les cases à cocher.

Quelques infos:

private void Checkbox_Click(object sender, RoutedEventArgs e) 
{ 
    CheckBox chkBox = e.OriginalSource as CheckBox; 
} 

Dans le code ci-dessus lorsque je clique sur une case à cocher, e.Handled est faux et chkBox.Parent est nulle.

réponse de Kent m'a mis sur la bonne voie, voici ce que je fini avec:

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox" PreviewKeyDown="ListBox_PreviewKeyDown"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" /> 
       <TextBlock Text="{Binding DisplayText}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

je devais utiliser PreviewKeyDown car par défaut lorsque vous appuyez sur la barre d'espace dans une zone de liste, il désélectionne tout sauf le dernier élément sélectionné.

Répondre

10

Pour commencer, mettre le contenu en dehors du CheckBox:

<StackPanel Orientation="Horizontal"> 
    <CheckBox IsChecked="{Binding IsChecked}"/> 
    <TextBlock Text="{Binding DisplayText}"/> 
</StackPanel> 

Après cela, vous devrez vous assurer que l'espace en appuyant sur un ListBoxItem résultats dans le CheckBox en cours de vérification. Il existe un certain nombre de façons de le faire, y compris un gestionnaire d'événements simple sur le ListBoxItem. Ou vous pouvez spécifier un gestionnaire pour UIElement.KeyUp ou que ce soit dans votre DataTemplate:

<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/> 
3

Vous pouvez également lier la propriété IsChecked de la CheckBox et la propriété IsSelected du ListBoxItem:

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+1

C'est comme ça que je l'ai eu au début. Le défaut est que les états de la case à cocher sont liés à l'état de sélection du contrôle de liste, ce qui n'est pas un comportement normal pour un contrôle de liste contenant des cases à cocher. –

2

Dans votre cas d'utilisation, il serait beaucoup plus simple d'utiliser un ItemsControl au lieu d'une zone de liste. Un ItemsControl est similaire à une Listbox sauf qu'il ne contient pas le comportement de sélection automatique. Ce qui signifie que l'utiliser pour héberger une liste de ce qui est essentiellement des cases à cocher est très simple et que vous n'avez pas à contourner le comportement de sélection de ListBox.

Il suffit de passer à ItemsControl vous donner exactement ce dont vous avez besoin:

<ItemsControl Style="{StaticResource CheckBoxListStyle}" Name="EditListBox"> 
    <ItemsControl .ItemTemplate> 
     <DataTemplate> 
      <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Vous pouvez cliquer sur le texte pour vérifier les cases à cocher (comportement par défaut) et vous pouvez utiliser le clavier aussi sans avoir à câbler des gestionnaires d'événements .

Questions connexes