WPF GridViewRowPresenter in einem Item
-
22-08-2019 - |
Frage
Ich fange gerade WPF zu lernen und ich versuche, eine GridViewRowPresenter innerhalb eines Itemscontrol zu verwenden, um im Wesentlichen die Funktionalität einer einfachen Tabelle in HTML zu kopieren. Das Listview ist nicht geeignet, da es interaktiv ist (was ich nicht will). Ich bin die Bindung an eine generische Liste der Objekte eine unbekannte Größe.
Ich habe eine Liste von einem benutzerdefinierten Objekt, das zwei String-Eigenschaften hat: Vornamen und Nachnamen. Der folgende Code funktioniert:
<ItemsControl Name="myItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=FirstName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
, während das macht nichts:
<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>
Ich bin mir nicht sicher, wo man von hier geht, und ich würde jede Hilfe sehr schätzen! Dank!
Lösung
Wenn Sie ein nicht-interaktiven Raster von Elementen wollen, können Sie eine ItemsControl
mit einem Grid
verwenden, die freigegebenen Größe Umfang verwendet:
<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>
Ein effizienter Ansatz wäre eine eigene Panel
Unterklasse zu schreiben, die in ähnlicher Weise Grid
funktioniert (man könnte wahrscheinlich Unterklasse Grid
), sondern fügt automatisch Zeilen wie nötig. Dann nutzen Sie diese Panel
als ItemsPanel
für die ItemsControl
.