Reputation: 1784
I have this xaml
code in a View
<StackPanel>
<Button Content="I am IRON" />
<ListView ItemsSource="{Binding Path=MeasuringDeviceCommunicators}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
The ItemSource
of the ListView
is bound to a List
in my ViewModel
(as shown in the code)
When I run the application all my TextBlocks
are shown vertically even though I have set the Orientation
of the inner StackPanel to Horizontal
.
Upvotes: 11
Views: 20284
Reputation: 13022
To change the layout of a ListView
, use the ItemsControl.ItemsPanel
property:
<StackPanel>
<Button Content="I am IRON" />
<ListView ItemsSource="{Binding Path=MeasuringDeviceCommunicators}" >
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<!-- Here is the panel that will contain the items -->
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<!-- Your item Template is here -->
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
You also may want to use a VirtualizingStackPanel
instead of StackPanel
, it may improve performance (if you have lot of items to show).
If you want to add a list in each item of your stack panel, you can do it by modifying the ItemTemplate
(which represents how each item is displayed).
For example:
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Name}"/>
<!-- Displays the tags (or whatever you want) -->
<ListView Grid.Column="2" ItemsSource="{Binding Tags}"/>
<Grid>
</DataTemplate>
</ListView.ItemTemplate>
To sum up, the ListView
has 3 interesting properties to define how it is rendered:
ItemsControl.ItemTemplate
: Represents how the items in the list are renderedItemsControl.ItemsPanel
: Represents the layout of the list (the position and size of the items in the list). You can use StackPanel
, VirtualizingStackPanel
, WrapPanel
, ... Control.Template
: Represents how the whole list is renderedHere is a code using all these properties:
<ListView>
<ListView.Items>
<Button Content="Button 1"/>
<Button Content="Button 2"/>
<Button Content="Button 3"/>
<Button Content="Button 4"/>
</ListView.Items>
<!-- The layout of the list (position and size of the elements -->
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<!-- StackPanel means : the elements are rendered in stack, either horizontally or vertically (the way it is rendered in StackPanel is defined in code -->
<StackPanel Orientation="Vertical" Background="LightCoral"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<!-- How I want the list to look like? -->
<ListView.Template>
<ControlTemplate>
<!-- A blue background with a green border -->
<Border Background="LightBlue" BorderBrush="DarkGreen" BorderThickness="5">
<!-- ItemsPresenter "represents" the ItemsPanel defined above -->
<ItemsPresenter HorizontalAlignment="Right" />
</Border>
</ControlTemplate>
</ListView.Template>
<!-- How I want each item to look like? -->
<ListView.ItemTemplate>
<DataTemplate>
<!-- A "This is an item:" label followed by the item itself -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="This is an item : "/>
<ContentPresenter Grid.Column="2" Content="{Binding}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Note, this part:
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" Background="LightCoral"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.Template>
<ControlTemplate>
<Border Background="LightBlue" BorderBrush="DarkGreen" BorderThickness="5">
<ItemsPresenter HorizontalAlignment="Right" />
</Border>
</ControlTemplate>
</ListView.Template>
is equivalent to:
<ListView.Template>
<ControlTemplate>
<Border Background="LightBlue" BorderBrush="DarkGreen" BorderThickness="5">
<StackPanel Orientation="Vertical" Background="LightCoral"
HorizontalAlignment="Right"
IsItemsHost="True"/>
</Border>
</ControlTemplate>
</ListView.Template>
Upvotes: 17