2015-09-18 53 views
1

對於ListView我想在項目之間顯示分隔符。但是,這很難實現,只有在日期發生變化時才能顯示。Win 10 UAP ListView條件分隔符

所以我想要列出的所有項目從1.1.2015。在2015年2月的項目開始之前,應該有一個分隔符(在這種情況下,只是帶有日期的文本)。 因此,我需要以某種方式訪問​​最後一個項目。

我的想法是將文本框放在<LV.ItemTemplate><DataTemplate>的開頭,綁定日期並將其可見性掛鉤到轉換器。但爲此,轉換器需要知道之前發生了什麼。

回答

2

這可以非常簡單地使用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到上面定義的itemsViewSourceCollectionViewSourceDataTemplate正好包含你想要的內容:要在元素組之間顯示的分隔符!這可以綁定到分組數據所屬的密鑰和轉換器,用於執行任何你想做的事情!

然後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();  
     } 
    } 
} 
+0

的GroupInfoList不存在對我來說(定義它自己通用應用程序),但我只是在LINQ和resharper改變返回類型爲IOrderedEnumerable >。除此之外,它效果很好。謝謝:) – dnanon

+0

我的不好,那是一個我忘了包括的自定義類。更新了答案以顯示我爲它做了什麼 – o0rebelious0o