I'm just starting learning WPF and I'm trying to use a GridViewRowPresenter inside of an ItemsControl to essentially duplicate the functionality of a simple table in HTML. The ListView is not appropriate since it is interactive (which I don't want). I am binding to a generic List of objects of an unknown quantity.
I have a List of a custom object that has two string properties: FirstName and LastName. The following code works:
<ItemsControl Name="myItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=FirstName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
while this renders nothing:
<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>
I'm not sure where to go from here and I would greatly appreciate any help! Thanks!
-
If you want a non-interactive grid of items, you can use an
ItemsControl
with aGrid
that uses shared size scope:<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>
A more efficient approach would be to write your own
Panel
subclass that works similarly toGrid
(you could probably subclassGrid
) but automatically adds rows as necessary. Then use thatPanel
as theItemsPanel
for theItemsControl
.HTH, Kent
0 comments:
Post a Comment