2010-03-11 10 views
3

Je suis assez nouveau pour WPF. J'ai une page qui affiche les données d'une base de données SQL en utilisant L2S. Le L2S renvoie un DataTable qui contient toutes les options disponibles pour une zone spécifique. Chaque ligne renvoyée par la base de données doit être un checkbox et je veux mettre ces cases à cocher dans un stackpanel. Est-ce que je regarde la liaison de données à StackPanel? Cela me semble faux ... Je devinais que je devais faire une boucle à travers le DataTable et créer des cases à cocher pour chaque ligne, puis les ajouter à l'exécution au StackPanel. Est-ce correct? Retourne une partie DataTable de mon problème?Populate StackPanel avec les cases à cocher de la base de données

Je vois que StackPanel a une propriété DataContext mais je ne peux pas simplement définir cette cause, il ne sait pas faire de chaque élément un checkbox, correct?

Répondre

8

Vous voulez probablement un ItemsControl. Cela vous permet de présenter une série d'éléments en utilisant un DataTemplate spécifié. Vous pouvez le faire en ligne du ItemsControl:

<ItemsControl ItemsSource="{Binding MyCollectionOfItems}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

ou faire référence au modèle de données explicitement à partir d'une ressource ... quelque chose comme:

<!-- In some parent resource section --> 
    <DataTemplate x:Key="MyDataTemplateName"> 
     <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
    </DataTemplate> 

    <!-- ... --> 

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}"> 
    </ItemsControl> 

Ou vous pouvez définir un DataTemplate qui définit le look et ressentez pour votre classe liée. (Notez que si votre LINQ to SQL est un type pénétrant dans Anonymous, ce n'est pas une option) Quelque chose comme:

 <!-- In some parent resource section --> 
     <DataTemplate DataType="{x:Type MyBoundClass}"> 
      <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/> 
     </DataTemplate> 

    <!-- ... --> 

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}"> 
    </ItemsControl> 

WPF cherchera alors un DataTemplate qui correspond au type de données de chacun des éléments dans votre collection. Notez que cela peut être TRÈS utile pour lier des collections hétérogènes nécessitant différentes présentations.

Vous pouvez lier le DataContext du Stackpanel, mais il n'y a pas de logique inhérente à la répétition d'un modèle pour chaque élément de données. Il fournit simplement un contexte pour les contrôles enfants et contient des instructions {Binding ...}. Tous les contrôles qui gèrent les données répétées descendent d'ItemsControl et emmènent leurs données via la propriété ItemsSource.

+0

+1 Bon, réponse complète. –

3

En plus de la réponse de Ben Von Handorf, j'ai pensé qu'il serait utile de mentionner que vous pouvez également changer la façon dont un ItemsControl arrange ses éléments en changeant le ItemsPanel. Par exemple:

<ListBox ItemsSource="{Binding MyCollection}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

Cela fait le ListBox organiser les éléments horizontalement au lieu de verticalement. Vous pouvez également utiliser un WrapPanel si vous voulez que les éléments "coulent" comme du texte (ou span si vous connaissez html). WrapPanel peut également être orienté horizontalement ou verticalement. (Mais essayez de ne pas utiliser WrapPanel pour les grandes collections d'éléments car ce n'est pas en train de virtualiser, et cela provoquera de gros lag.)

Vous pouvez même créer vos propres panneaux personnalisés et les remplacer. Une fois, j'ai créé un panneau qui présentait ses éléments de manière aléatoire, et l'utilisais pour un ListBox. Chaque élément de ma collection liée était affiché dans une position aléatoire dans le ListBox. Chaque fois que la mise en page est actualisée, les éléments ont obtenu une nouvelle position.

+1

Excellent point ... J'aurais dû couvrir ça. Merci de remplir mon trou. :) –