我在xaml
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>
ItemSource
的{{1}}绑定到ListView
中的List
(如代码所示)
当我运行应用程序时,即使我已将内部StackPanel的ViewModel
设置为TextBlocks
,我的所有Orientation
都会垂直显示。
答案 0 :(得分:15)
要更改ListView
的布局,请使用ItemsControl.ItemsPanel
属性:
<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>
您可能还想使用VirtualizingStackPanel
代替StackPanel
,这可能会提高效果(如果您要展示很多项目)。
如果要在堆栈面板的每个项目中添加列表,可以通过修改ItemTemplate
(表示每个项目的显示方式)来实现。
例如:
<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>
总而言之,ListView
有3个有趣的属性来定义它的呈现方式:
ItemsControl.ItemTemplate
:表示如何呈现列表中的项目ItemsControl.ItemsPanel
:表示列表的布局(列表中项目的位置和大小)。您可以使用StackPanel
,VirtualizingStackPanel
,WrapPanel
,... Control.Template
:表示整个列表的呈现方式以下是使用所有这些属性的代码:
<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>
注意,这部分:
<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>
相当于:
<ListView.Template>
<ControlTemplate>
<Border Background="LightBlue" BorderBrush="DarkGreen" BorderThickness="5">
<StackPanel Orientation="Vertical" Background="LightCoral"
HorizontalAlignment="Right"
IsItemsHost="True"/>
</Border>
</ControlTemplate>
</ListView.Template>