vb.netwindows-phone-8longlistselectorgrouped-table

LongListSelector with custom Grouping in VB


So I'm working on WP8 app and I'm trying to figure out to get my LongListSelector to show custom groups. Basically what I have is a section where messages will be displayed but messages can be generated from 2 different places in the web application so they need to be grouped in the appropriate categories (Alerts and BTR's). I tried going through the example code that is on MSDN but since it's only in C# I'm getting stuck on certain parts and right now my LLS is only showing one item from the list. I think it has something to do with me not using the AlphaKeyGroup that is referenced in the example (but again I can't really use it since I'm not sorting by a character in the messages but instead there's an type value that is passed from the Webservice). Below is my XAML code for the LLS and the Date Templates

<!--Panorama item one-->
            <phone:PanoramaItem x:Name="item1" Header="Messages">
                <phone:LongListSelector x:Name="messageList" 
                                        LayoutMode="List"
                                        GroupHeaderTemplate="{StaticResource MessagesHeaderTemplate}"
                                        ItemTemplate="{StaticResource AlertMessageTemplate}" IsGroupingEnabled="True"/>
            </phone:PanoramaItem>

<!-- Template for Alert Messages-->
        <DataTemplate x:Key="AlertMessageTemplate">
            <StackPanel VerticalAlignment="Top">
                <TextBlock Text="{Binding AlertDate}" Foreground="Black"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="MessagesHeaderTemplate">
            <Border Background="Transparent" Padding="5">
                <Border Background="#FF27AAE1" Margin="0,0,18,0" HorizontalAlignment="Left">
                    <TextBlock Text="{Binding MessageGroup}"  Foreground="White" FontSize="48" Padding="6" 
            FontFamily="{StaticResource PhoneFontFamilySemiLight}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                </Border>
            </Border>
        </DataTemplate>

And here is the VB code that I'm using just to create a quick test with a Group value and a date (in the actual working version there will be three pieces of text that are displayed and the type value can be an integer or string if one is easier than the other to work with in this scenario).

Private Sub SetupMessageList()
        Dim source As New List(Of AlertMessage)()
        source.Add(New AlertMessage("Alert", "10/01/2010"))
        source.Add(New AlertMessage("Alert", "11/01/2010"))
        source.Add(New AlertMessage("Alert", "2/15/2012"))
        source.Add(New AlertMessage("Alert", "3/15/2013"))
        source.Add(New AlertMessage("BTR", "10/01/2010"))
        source.Add(New AlertMessage("BTR", "11/01/2010"))
        source.Add(New AlertMessage("BTR", "2/15/2012"))
        source.Add(New AlertMessage("BTR", "3/15/2013"))
        messageList.ItemsSource = source
    End Sub
    'Class For building Alert Messages from Web Service
    Public Class AlertMessage
        Private m_MessageGroup As String
        Public Property MessageGroup As String
            Get
                Return m_MessageGroup
            End Get
            Set(value As String)
                m_MessageGroup = value
            End Set
        End Property

        Private m_AlertDate As String
        Public Property AlertDate As String
            Get
                Return m_AlertDate
            End Get
            Set(value As String)
                m_AlertDate = value
            End Set
        End Property

        Public Sub New(messagegroup As String, alertdate As String)
            Me.MessageGroup = messagegroup
            Me.AlertDate = alertdate
        End Sub
    End Class

Solution

  • So I was able to figure it out using a custom string key group that would let me choose what string I want to use as a Key. I'm posting it below in case anyone else wants it:

    Imports System.Collections.Generic
    Imports System.Collections.ObjectModel
    Imports System.Globalization
    Imports System.Linq
    
    Public Class StringKeyGroup(Of T)
        Inherits ObservableCollection(Of T)
        Public Delegate Function GetKeyDelegate(item As T) As String
        Public Property Key() As String
            Get
                Return m_Key
            End Get
            Private Set(value As String)
                m_Key = value
            End Set
        End Property
        Private m_Key As String
        Public Sub New(key__1 As String)
            Key = key__1
        End Sub
        Public Shared Function CreateGroups(items As IEnumerable(Of T), ci As CultureInfo, getKey As GetKeyDelegate, sort As Boolean) As ObservableCollection(Of StringKeyGroup(Of T))
            Dim list = New ObservableCollection(Of StringKeyGroup(Of T))()
    
            For Each itemstring In items
                Dim index = -1
                For i As Integer = 0 To list.Count - 1
                    If list(i).Key.Equals(getKey(itemstring)) Then
                        index = i
                        Exit For
                    End If
                Next
                If index = -1 Then
                    list.Add(New StringKeyGroup(Of T)(getKey(itemstring)))
                    index = list.Count - 1
                End If
                If index >= 0 AndAlso index < list.Count Then
                    list(index).Add(itemstring)
                End If
            Next
    
            If sort Then
                For Each group In list
                    group.ToList().Sort(Function(c0, c1) ci.CompareInfo.Compare(getKey(c0), getKey(c1)))
                Next
            End If
    
            Return list
        End Function
    End Class