对于ListView,我想在Items之间显示一个分隔符。然而,使它变得有点困难的是它只应在日期改变时显示。
所以我希望列出1.1.2015中的所有项目。在2.1.2015的项目开始之前,应该有一个分隔符(在这种情况下只是带有日期的文本)。 因此,我需要以某种方式访问最后一项。
我的想法是将TextBox放在<LV.ItemTemplate><DataTemplate>
的开头,绑定日期并将它的可见性挂钩到转换器。但为此,转换器需要知道之前的日期。
答案 0 :(得分:2)
这可以非常简单地使用开箱即用的ListView
和CollectionViewSource
绑定的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
CollectionViewSource
。 DataTemplate
包含您想要的内容:在元素组之间显示的分隔符!这可以绑定到分组数据所属的密钥以及用于执行任何操作的转换器!
然后从与源数据中的键配对的列表对象中显示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