LongListSelector with String group header
.net, c#, windows-phone-7, windows-phone-8, wpf
Solution
Define a class like this
public class PlaylistItem
{
public string ItemName { get; set; }
public string PlayListGroup { get; set; }
}
public MainPage()
{
InitializeComponent();
List<PlaylistItem> PlayList = new List<PlaylistItem>();
//Add your playlistitems in PlayList
PlayList.Add(new PlaylistItem() { ItemName = "abc", PlayListGroup = "Vimeo Playlist" });
PlayList.Add(new PlaylistItem() { ItemName = "ab", PlayListGroup = "Playlist" });
var groupedPlayList =
from list in PlayList
group list by list.PlayListGroup into listByGroup
select new KeyedList<string, PlaylistItem>(listByGroup);
LongListSelectorList.ItemsSource = new List<KeyedList<string, PlaylistItem>>(groupedPlayList);
}
Now define KeyedList as
public class KeyedList<TKey, TItem> : List<TItem>
{
public TKey Key { protected set; get; }
public KeyedList(TKey key, IEnumerable<TItem> items)
: base(items)
{
Key = key;
}
public KeyedList(IGrouping<TKey, TItem> grouping)
: base(grouping)
{
Key = grouping.Key;
}
}
Remember: In groupHeader Template bind the `TextBlock` text as
<TextBlock Text="{Binding Key}" />
Problem
I have this class `AlphaKeyGroup`: ``` public class AlphaKeyGroup<T> : List<T> { /// <summary> /// The delegate that is used to get the key information. /// </summary> /// <param name="item">An object of type T</param> /// <returns>The key value to use for this object</returns> public delegate string GetKeyDelegate(T item); /// <summary> /// The Key of this group. /// </summary> public string Key { get; private set; } /// <summary> /// Public constructor. /// </summary> /// <param name="key">The key for this group.</param> public AlphaKeyGroup(string key) { Key = key; } /// <summary> /// Create a list of AlphaGroup<T> with keys set by a SortedLocaleGrouping. /// </summary> /// <param name="slg">The </param> /// <returns>Theitems source for a LongListSelector</returns> private static List<AlphaKeyGroup<T>> CreateGroups(SortedLocaleGrouping slg) { List<AlphaKeyGroup<T>> list = new List<AlphaKeyGroup<T>>(); foreach (string key in slg.GroupDisplayNames) { list.Add(new AlphaKeyGroup<T>(key)); } return list; } /// <summary> /// Create a list of AlphaGroup<T> with keys set by a SortedLocaleGrouping. /// </summary> /// <param name="items">The items to place in the groups.</param> /// <param name="ci">The CultureInfo to group and sort by.</param> /// <param name="getKey">A delegate to get the key from an item.</param> /// <param name="sort">Will sort the data if true.</param> /// <returns>An items source for a LongListSelector</returns> public static List<AlphaKeyGroup<T>> CreateGroups(IEnumerable<T> items, CultureInfo ci, GetKeyDelegate getKey, bool sort) { SortedLocaleGrouping slg = new SortedLocaleGrouping(ci); List<AlphaKeyGroup<T>> list = CreateGroups(slg); foreach (T item in items) { int index = 0; if (slg.SupportsPhonetics) { //check if your database has yomi string for item //if it does not, then do you want to generate Yomi or ask the user for this item. //index = slg.GetGroupIndex(getKey(Yomiof(item))); } else { index = slg.GetGroupIndex(getKey(item)); } if (index >= 0 && index < list.Count) { list[index].Add(item); } } if (sort) { foreach (AlphaKeyGroup<T> group in list) { group.Sort((c0, c1) => { return ci.CompareInfo.Compare(getKey(c0), getKey(c1)); }); } } return list; } } ``` And this is how i create my `LongListSelector` ItemsSource: ``` foreach (string item in playlistRep.playlistDic.Keys) { playlistCollection.Add(new PlaylistItem(item, playlistRep.playlistDic[item].Count)); } List<AlphaKeyGroup<PlaylistItem>> DataSource = AlphaKeyGroup<PlaylistItem>.CreateGroups(playlistCollection, System.Threading.Thread.CurrentThread.CurrentUICulture, (PlaylistItem s) => { return s.Name; }, true); playlistList.ItemsSource = DataSource; ``` And i get a LongListSelector with a keys like this: ``` "A" a... a... a.... "B" "C" c..... c.. c.. ........ ``` And i want to know what should i do to get the group name with something like this: ``` "Playlist" bla bla bla "Vimeo Playlist" bla bla bla ``` I want to be able create a header with string and not chars