gpt4 book ai didi

windows - Win 10 UAP ListView 条件分隔符

转载 作者:可可西里 更新时间:2023-11-01 11:49:54 25 4
gpt4 key购买 nike

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

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

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

最佳答案

这可以非常简单地使用开箱即用的 ListView 来完成与分组 CollectionViewSource ListView是绑定(bind)的。

关于如何执行此操作的非常简单的概述:

到您的 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>

此代码段绑定(bind)了 ListView 的 itemsSource到 itemsViewSource CollectionViewSource上面定义。 DataTemplate完全包含您想要的内容:要在元素组之间显示的分隔线!这可以绑定(bind)到分组数据所属的键和一个转换器用来做任何你想做的事情!

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

现在这行得通了,我们如何将数据转换成我们的 xaml 希望它使用的格式...

在后面的代码中,我假设你有一个 List您要显示的对象的数量,因为我没有您原始问题的任何信息,例如 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 的列表对象,并按其 string first_name 对它们进行分组属性。您显然需要调整此 LINQ 查询以按您想要的日期对对象进行分组!

一旦你有了你的分组对象,你需要将它绑定(bind)到你的 ListView在您的代码前端:

if (_friendsGrouped != null)
{
var cvs = (CollectionViewSource)Resources["itemsViewSource"];
cvs.Source = _friendsGrouped;
}

希望这对您有所帮助!

编辑:

如 OP 所述,GroupInfoList不作为标准类存在,我自己定义如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace App.Models
{
public class GroupInfoList<T> : List<object>
{
public object Key { get; set; }
public new IEnumerator<object> GetEnumerator()
{
return (System.Collections.Generic.IEnumerator<object>)base.GetEnumerator();
}
}
}

关于windows - Win 10 UAP ListView 条件分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com