【wpf】ListView 和 ItemsControl 的一点区别

ItemsControl 实现背景间隔效果

<ItemsControl ItemsSource="{StaticResource datas}" AlternationCount="2">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Background="Transparent" Name="root">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Age}" Grid.Column="1"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="Orange" TargetName="root"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ListView实现背景间隔效果

listview无法直接通过DataTemplate.Triggers去设置,只能通过ItemContainerStyle的方式

<ListView ItemsSource="{StaticResource datas}" AlternationCount="2">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="Orange"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">

                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Background="Transparent" Name="root">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Age}" Grid.Column="1"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

通过snoop观察,listview比ItemsControl 多封装了几层:

 由于多了个ListViewItem这一层(所以ListView的数据模板里访问不到ItemsControl中的某些属性),他的下一层才是ItemsControl,所以通过ItemContainerStyle指定了之后ListViewItem才能这么写:ItemsControl.AlternationIndex。

ItemContainerStyle

这个属性在很多列表控件中是用的很频繁的。我在博客【WPF绑定3】 ListView基础绑定和数据模板绑定 也介绍过,可以看看。

StackPanel vs  VirtualizingStackPanel

从上图可以看到,

ItemsControl 使用的是StackPanel    

ListView 使用的是 VirtualizingStackPanel。

VirtualizingStackPanel相较于StackPanel 是做了优化的,VirtualizingStackPanel不会渲染框框之外看不到的子项,也就是当子项较多时,VirtualizingStackPanel将提供更好的性能。

posted @ 2022-08-01 10:51  宋桓公  阅读(57)  评论(0编辑  收藏  举报