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

Original source