WPF GridViewRowPresenter dans un ItemsControl
-
22-08-2019 - |
Question
Je viens juste de commencer l'apprentissage WPF et je suis en train d'utiliser un GridViewRowPresenter à l'intérieur d'un ItemsControl pour dupliquer essentiellement la fonctionnalité d'un tableau simple en HTML. Le ListView ne convient pas car il est interactif (que je ne veux pas). Je suis lier à une liste générique des objets d'une quantité inconnue.
J'ai une liste d'un objet personnalisé qui a deux propriétés de chaîne: FirstName et LastName. Le code suivant fonctionne:
<ItemsControl Name="myItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=FirstName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
tout cela rend rien:
<ItemsControl Name="myItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<GridViewRowPresenter>
<GridViewRowPresenter.Columns>
<GridViewColumnCollection>
<GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}"></GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=LastName}"></GridViewColumn>
</GridViewColumnCollection>
</GridViewRowPresenter.Columns>
</GridViewRowPresenter>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Je ne sais pas où aller d'ici et je serais très reconnaissant de toute aide! Merci!
La solution
Si vous voulez une grille non interactive des éléments, vous pouvez utiliser un ItemsControl
avec un Grid
qui utilise la portée de la taille Partagée:
<ItemsControl ItemsSource="{Binding Items}" Grid.IsSharedSizeScope="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" SharedSizeGroup="FirstName"/>
<ColumnDefinition Width="*" SharedSizeGroup="LastName"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding FirstName}"/>
<TextBlock Grid.Column="1" Text="{Binding LastName}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Une approche plus efficace serait d'écrire votre propre sous-classe Panel
qui fonctionne de façon similaire à Grid
(vous pouvez probablement sous-classe Grid
), mais ajoute automatiquement des lignes si nécessaire. Utilisez ensuite que Panel
comme ItemsPanel
pour le ItemsControl
.