UWP LongListSelector 在 ZoomedOutView 所需要的分組 Key 該怎麼簡單的分類呢?
之前的文章 UWP 的 LongListSelector 在做 ZoomedOutView 的畫面時,
用的是所有資料的第一個字當作分類的 Key,
這或許在英文語系上還可行,但是遇到中文字就不適用了,
這篇我們來介紹如何做多語系的分類。
專案內容就接續 UWP 的 LongListSelector 的專案,讓我們繼續改進他。
在 DataManager 類別裡,我們增加一些中文的模擬資料,
造之前取第一個字當作分類的 Key 的作法會如下圖
中文也是取第一個字來分類,這看起來不太妙!
所以分類方式就要改變了,
先在 Models 目錄下增加一個類別 AlphaKeyContent,程式碼如下
public class AlphaKeyContent : ObservableCollection<AccountItem>{
public string Key { get; set; }
}
這是用來放我們分類資料的類別。
再來將 DataManager 的建構式改寫成下面程式碼
public DataManager() {
AlphaGroups = new ObservableCollection<AlphaKeyContent>();
CharacterGroupings cg = new CharacterGroupings();
foreach (var key in cg) {
if (!string.IsNullOrEmpty(key.Label)) {
AlphaGroups.Add(new AlphaKeyContent { Key = key.Label });
}
}
var list = from f in DataList
group f by cg.Lookup(f.Name) into g
orderby g.Key
select g;
foreach (var group in list) {
var collection = AlphaGroups.FirstOrDefault(f => group.Key.Equals(f.Key));
if (collection == null) collection = AlphaGroups.Last();
foreach (var item in group) {
collection.Add(item);
}
}
}
這裡的重點就是 CharacterGroupings 這個類別了,
首先 CharacterGroupings 本身就是一個集合,內容是 CharacterGrouping ,在此系統下的文字分類。
因為我們想把所有分類都顯示出來,所以會用 foreach 將 AlphaKeyContent 先建立起來。
再來就使用 CharacterGroupings .Lookup,他會回傳參數給的字其所在的分類。
但是執行結果會如下
沒有資料的 Group 也被顯示出來了,所以在 Xaml 的 GroupStyle 要特別設定一個屬性 HidesIfEmpty = "true"
<GroupStyle HeaderTemplate="{StaticResource GroupHeaderDataTemplate}" HidesIfEmpty="True"/>
接著為了美觀,我們也把 ZoomedOutView 的 ListView 改成 GridView。
並將 ZoomOutHeaderDataTemplate 改成適合 GridView 內容的樣式,
再運用 UWP 的 DataTriggerBehavior 這篇介紹的 DataTriggerBehavior 來讓沒有資料的 Group 變色就大功告成囉!
最後完成的 DataTemplate 如下
<DataTemplate x:Key="ZoomOutHeaderDataTemplate">
<Grid Height="100" Width="100">
<TextBlock Text="{Binding Group.Key}" Style="{StaticResource HeaderTextBlockStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="{ThemeResource SystemControlBackgroundAccentBrush}">
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{Binding Group.Count, Mode=OneWay}" Value="0">
<Core:ChangePropertyAction PropertyName="Foreground">
<Core:ChangePropertyAction.Value>
<SolidColorBrush Color="#FFB4B4B4"/>
</Core:ChangePropertyAction.Value>
</Core:ChangePropertyAction>
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBlock>
</Grid>
</DataTemplate>
執行結果如下