赢得10 UAP ListView条件分隔符

时间:2015-09-18 12:13:50

标签: windows listview windows-10 win-universal-app

对于ListView,我想在Items之间显示一个分隔符。然而,使它变得有点困难的是它只应在日期改变时显示。

所以我希望列出1.1.2015中的所有项目。在2.1.2015的项目开始之前,应该有一个分隔符(在这种情况下只是带有日期的文本)。 因此,我需要以某种方式访问​​最后一项。

我的想法是将TextBox放在<LV.ItemTemplate><DataTemplate>的开头,绑定日期并将它的可见性挂钩到转换器。但为此,转换器需要知道之前的日期。

1 个答案:

答案 0 :(得分:2)

这可以非常简单地使用开箱即用的ListViewCollectionViewSource绑定的ListView来完成。

如何执行此操作的简单概述:

到您的xaml页面,添加

<Page.Resources>
        <CollectionViewSource x:Name="itemsViewSource" IsSourceGrouped="true" />
</Page.Resources>

对于ListView,您可以执行

<ListView x:Name="friendsList" Width="200" Grid.Column="0" ItemsSource="{Binding Source={StaticResource itemsViewSource}}">
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock
                    Text="{Binding Key}"
                    FontSize="40" />
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListView.GroupStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Ellipse Margin="8" Width="32" Height="32">
                    <Ellipse.Fill>
                        <ImageBrush x:Name="UserHero" Stretch="Uniform" ImageSource="{Binding picture.small}"/>
                    </Ellipse.Fill>
                </Ellipse>
                <TextBlock Text="{Binding first_name}" Margin="8" VerticalAlignment="Center"/>
                <TextBlock Text="{Binding last_name}" Margin="8" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

此代码段将ListView的itemsSource绑定到上面定义的itemsViewSource CollectionViewSourceDataTemplate包含您想要的内容:在元素组之间显示的分隔符!这可以绑定到分组数据所属的密钥以及用于执行任何操作的转换器!

然后从与源数据中的键配对的列表对象中显示ListView项。

现在这样可行,我们如何将数据转换为xaml希望它使用的格式...

在后面的代码中,我假设您有List个您想要显示的对象,因为我没有原始问题中的任何信息,例如{{ 1}}。我们需要做的是将其转换为private List<Object> _objects

我们可以使用精彩的List<GroupedInfoList<Object>> _groupedObjects来做到这一点。为了说明这一点,我将在项目中使用真实数据对象向我展示我的一个项目的片段(对象的细节并不重要):

LINQ

此代码段列出了public async Task<List<GroupInfoList<object>>> GetFriendsGrouped() { if(_friends == null) { _friends = await NetworkManager.GetFriends(); } List<GroupInfoList<object>> friendsGrouped = new List<GroupInfoList<object>>(); var query = from friend in _friends orderby ((Friend)friend).first_name group friend by ((Friend)friend).first_name[0] into g select new { GroupName = g.Key, Items = g }; foreach (var g in query) { GroupInfoList<object> info = new GroupInfoList<object>(); info.Key = g.GroupName; foreach (var friend in g.Items) { info.Add(friend); } friendsGrouped.Add(info); } return friendsGrouped; } 个对象,并按其Friend属性对其进行分组。您显然需要调整此LINQ查询以按日期对对象进行分组,这是您想要的!

获得分组对象后,需要将其绑定到代码前端中的string first_name

ListView

希望这有帮助!

修改

如OP所述,if (_friendsGrouped != null) { var cvs = (CollectionViewSource)Resources["itemsViewSource"]; cvs.Source = _friendsGrouped; } 并不作为标准类存在,我自己定义如下

GroupInfoList