Question

J'ai une grille avec seulement 1 ligne. Je voudrais que la quantité de colonnes soit déterminée par le contexte de données de la grille.

Par exemple, si j'ai une liste de noms exposés dans une propriété ObservableCollection appelée "Noms" qui renvoie "Fred", "Joe" et "Anne", j'aimerais trois colonnes dans la grille, chacune avec une zone de texte liée à chaque nom.

Mes pensées jusqu'à présent:

1) Construisez la grille à la main dans le code-behind et reconstruisez-la lorsque la ObservableCollection change. Je n’y suis pas allé car cela me semblait un peu flou et pas la façon de faire de WPF.

2) Créez une liaison avec la propriété ColumnDefinitions de la grille. Cela semblait plus correct, mais il n’ya pas de propriété de dépendance sur la grille pour ColumnDefinition.

Était-ce utile?

La solution

Je ne pense pas que modifier une grille à la volée soit votre meilleur choix. Voici une autre solution. Vous pouvez utiliser ListBox, mais remplacez ItemsPanel par un autre panneau de votre choix. ItemsPanel par défaut de ListBox est VirtualizingStackPanel avec Orientation défini sur Vertical. Comme vous souhaitez que vos éléments s'affichent horizontalement, vous pouvez le remplacer par VirtualizingStackPanel avec Orientation défini sur Horizontal . Bien sûr, vous pouvez modifier le modèle ItemsTemplate ou n’importe quoi d’autre comme bon vous semble.

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

J'ai également déjà utilisé cette méthode pour créer un contrôle ListBox qui affiche les éléments horizontalement, mais passe à la ligne suivante lorsqu'il manque d'espace sur la ligne, à l'aide d'un WrapPanel. Vous pouvez également créer vos propres panneaux personnalisés et les remplacer. Une fois, j'ai créé un panneau présentant ses éléments au hasard et utilisé celui-ci pour un contrôle ListBox. Chaque élément de ma collection liée était affiché dans une position aléatoire dans le contrôle ListBox. Chaque fois que la mise en page est rafraîchie, les éléments ont une nouvelle position.

Autres conseils

S'il s'agit d'un DataGrid , AutoGenerateColumns ferait cela. En utilisant DataGridTemplateColumn , vous pouvez mettre des contrôles de zone de texte au lieu d’un texte. Vous devez fournir un événement attaché à AutoGeneratingColumn et dans le AutoGeneratingColumnEventArgs (bonjour, Microsoft, il s'agit d'un appel de tunnel carpel), définissez la propriété Column sur une colonne de modèle avec la zone de texte.

Je dirais que votre méthode ObservableCollection est plus simple ;-P.

Si vous pouvez accepter que les noms soient placés dans chaque ligne plutôt que dans chaque colonne, vous devez utiliser ListView avec une propriété GridView View et un CellTemplate personnalisé qui est simplement une zone de texte liée. Quelque chose comme ça:

<ListView ItemsSource="{Binding Names}">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
          <!-- Your textbox goes in a DataTemplate here -->             
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

La solution n ° 2 n’est malheureusement pas possible en XAML. La solution n ° 1 est votre meilleur choix si vous devez avoir chaque nom dans sa propre colonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top