Windows 8 Metro中对GridView或ListView使用分组功能详解

本文介绍了如何在Windows 8 Metro应用中使用GridView或ListView进行数据分组,通过添加和配置GroupStyle、ItemTemplate、数据源及数据绑定,实现清晰的界面展示。详细步骤包括XAML代码的编写、数据源结构的设计以及数据绑定过程,帮助开发者理解并掌握分组功能。

在应用中使用GridView或ListView可以页面上很多信息能更明朗化,如果再加上分组的话那就更清晰了。以下是本人查阅资料整理的关于Group化的知识点。

 

先来张效果图:

 

以GridView为例,步骤如下:

 

1、在XAML中先放一个GridView控件,然后右击该控件,选择添加分组。

 

添加以后,<GridView>标签里会自动添加一长串代码,如下:

<GridView>
    <GridView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="GroupItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="GroupItem">
                                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="*"/>
                                        </Grid.RowDefinitions>
                                        <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"/>
                                        <ItemsControl x:Name="ItemsControl" ItemsSource="{Binding GroupItems}" Grid.Row="1"/>
                                    </Grid>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock/>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
            <GroupStyle.Panel>
                <ItemsPanelTemplate>
                    <VariableSizedWrapGrid/>
                </ItemsPanelTemplate>
            </GroupStyle.Panel>
        </GroupStyle>
    </GridView.GroupStyle>
</GridView>


2、修改代码,改成自己想要的样式。

    1)分析下代码,发现代码里多的是一个叫GroupStyle的属性,下面又分别有ContainerStyle(容器属性,以上图为例,包括省和城市的一整块区域)、HeaderTemplate(标题模板,以上图为例,显示省的区域的模板)、Panel(排版,设置每个Container横向还是竖向排列,每行或每列的最大数)。

    其中HeaderTemplate是必要的,保留并修改<DataTemplate>标签里的控件即可。其他两个属性不需要修改的话可以直接删掉。

 

    2)接下来添加ItemTemplate,此时的ItemTemplate还是和往常一样代表每一个具体子模板(以上图为例,表示城市的区域的模板)。修改成自己想要的样式即可。

 

3、数据源。

    这里要绑定的数据源不能是普通的 List 之类的 source,也要有分组的结构。即 List 下的每一个 object 包含一个Key(对应Header,如省)和一个 List (对应该Key下的 Items,如该省的城市)。如:

    class Province
    {
        public string ProvinceName { set; get; }
        public List<string> CityNames { set; get; }
    }


 

4、控件绑定。

    先定义个CollectionViewSource。

<CollectionViewSource x:Name="InfoList" IsSourceGrouped="True" ItemsPath="CityNames"/>

 

其中,IsSourceGrouped要设为 true,ItemsPath对应各 ItemTemplate 的数据源路径。

 

    给GridView绑定 CollectionViewSource。

<GridView ItemsSource="{Binding Source={StaticResource InfoList}}">

    给Header(标题)绑定。

 <GroupStyle.HeaderTemplate>
     <DataTemplate>
         <TextBlock Text="{Binding ProvinceName}"/>
     </DataTemplate>
 </GroupStyle.HeaderTemplate>


这里要要绑定数据源的Key,即 ProvinceName 。

 

    给 Item 绑定。

<GridView.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding}" />
    </DataTemplate>
</GridView.ItemTemplate>


这里因为 CollectionViewSource 里指定了Path 为CityNames ,故在此只写 Binding 即可,每个 Item 会自动去取 CityNames 下的 string。如果 Item 的模板比较复杂, CityNames 也不只是个 string 的 List,那么具体情况,在 Binding 后面加上要绑定的数据路径。 

 

5、数据绑定。

    在 .cs 文件里创建个 Province 的 List,赋一些初始值,再加到 CollectionViewSource 上去。

List<Province> list = new List<Province>();
// ...
// 通过检索数据库或手动塞一些值到 list 里去
// ...
InfoList.Source = list;


6、运行程序查看效果。参照第一张图片展示。(具体效果可能有点出入,因为上图的效果里本人设置了 Panel 属性。)

 

XAML中 GridView 的完整代码如下:

<Page.Resources>
        <CollectionViewSource x:Name="InfoList" IsSourceGrouped="True" ItemsPath="CityNames"/>
</Page.Resources>

<GridView ItemsSource="{Binding Source={StaticResource InfoList}}">
    <GridView.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding ProvinceName}"/>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </GridView.GroupStyle>

    <GridView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>


 如果对分组熟悉了的话,以上的第一步就不需要了,直接在 <GridView> 标签里写代码就是了。不需要特别的格式什么的话,ContainerStyle 和 Panel 都可以不设,如果要设的话,就写上。自己想要什么样的模板,自己去创建吧。

 

另外,分组功能配合 SemanticZoom 控件来用的话,效果会更好,这里暂时就不介绍了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值