對於ListView我想在項目之間顯示分隔符。但是,這很難實現,只有在日期發生變化時才能顯示。Win 10 UAP ListView條件分隔符
所以我想要列出的所有項目從1.1.2015。在2015年2月的項目開始之前,應該有一個分隔符(在這種情況下,只是帶有日期的文本)。 因此,我需要以某種方式訪問最後一個項目。
我的想法是將文本框放在<LV.ItemTemplate><DataTemplate>
的開頭,綁定日期並將其可見性掛鉤到轉換器。但爲此,轉換器需要知道之前發生了什麼。
對於ListView我想在項目之間顯示分隔符。但是,這很難實現,只有在日期發生變化時才能顯示。Win 10 UAP ListView條件分隔符
所以我想要列出的所有項目從1.1.2015。在2015年2月的項目開始之前,應該有一個分隔符(在這種情況下,只是帶有日期的文本)。 因此,我需要以某種方式訪問最後一個項目。
我的想法是將文本框放在<LV.ItemTemplate><DataTemplate>
的開頭,綁定日期並將其可見性掛鉤到轉換器。但爲此,轉換器需要知道之前發生了什麼。
這可以非常簡單地使用ListView
開箱即可完成,其中ListView
被綁定到CollectionViewSource
。
一個非常簡單的如何做到這一點的概述:
要在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>
這個片段綁定的ItemsSource ListView
到上面定義的itemsViewSource
CollectionViewSource
。 DataTemplate
正好包含你想要的內容:要在元素組之間顯示的分隔符!這可以綁定到分組數據所屬的密鑰和轉換器,用於執行任何你想做的事情!
然後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查詢來按照你想要的日期對對象進行分組!
一旦你有你組合的對象,你需要把它綁定到你的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();
}
}
}
的GroupInfoList不存在對我來說(定義它自己通用應用程序),但我只是在LINQ和resharper改變返回類型爲IOrderedEnumerable>。除此之外,它效果很好。謝謝:) –
dnanon
我的不好,那是一個我忘了包括的自定義類。更新了答案以顯示我爲它做了什麼 – o0rebelious0o