2010-05-20 6 views
1

J'ai une zone de liste, qui est défini comme ceci:WPF - Obtenir propriété checked ComboBox ListBox

<ListBox ItemsSource="{Binding Source={x:Static local:ResourceCollection.resourceList}}" Height="143" HorizontalAlignment="Left" Margin="6,6,0,0" Name="assignmentLB" VerticalAlignment="Top" Width="287" FontSize="12" FontWeight="Normal" IsEnabled="True" Grid.Column="0"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox /> 
       <TextBlock Text="{Binding Content}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Comment puis-je boucle à travers cette zone de liste et récupérer la valeur TextBlock.Text pour les éléments que dont Checkbox a été vérifié?

Aussi ... comment puis-je espacer horizontalement la case du bloc de texte. En ce moment, ils sont l'un à côté de l'autre sans espacement.

+0

En ce qui concerne l'espacement, avez-vous essayé d'utiliser 'Margin' dans les éléments de' StackPanel'? – Dave

+0

Je viens de le faire, il place la marge sur le côté gauche de la case à cocher, cependant, la case à cocher et le bloc de texte sont toujours en place les uns contre les autres. Merci pour la suggestion. –

Répondre

2

Ajouter une propriété booléenne à la classe que vous liez (le même avec la propriété Content) et lier le CheckBox à lui, comme ceci:

<CheckBox IsChecked="{Binding IsSelected}"/>

Ensuite, vous pouvez faire une boucle sur la resourceList et saisir tous les éléments qui ont IsSelected la valeur true, comme celui-ci:

resourceList.Where(r => r.IsSelected);

En ce qui concerne l'espacement horizontal, vous avez juste besoin de fournir un Margin au CheckBox ou au TextBlock, ou aux deux. Une marge de 5,0 sur le TextBlock devrait être tout ce dont vous avez besoin.

+0

Nice! Je parie que je vais devoir utiliser cette approche un jour. – Dave

+0

Ma classe statique (ResourceCollection) est partagée entre plusieurs fenêtres. Par exemple: il peut y avoir plusieurs fenêtres ouvertes, partageant toutes le même ResourceCollection. Si je modifie cela alors cela causerait des problèmes dans d'autres fenêtres. –

+1

Bien, sauf si les autres fenêtres font également référence à cette nouvelle propriété sélectionnée, vous ne verrez aucune modification. C'est la bonne façon de le faire, et si cela n'est pas possible, vous devez apporter quelques modifications à l'infrastructure. Dans le pire des cas, vous enveloppez votre classe de ressources dans une classe de liaison de données qui contient la propriété sélectionnée, puis vous liez cette classe dans votre ListBox pour cette fenêtre particulière. – Charlie