ListView gruppiert

Aufbauend auf einem vorigen WinRT Beispiel wird nun eine Master Detail oder auch Gruppe eingeführt. Dazu wird die Person um die Eigenschaft sex (Geschlecht) erweitert und dann danach gruppiert. Erschwerend kommt hinzu das nur männlich als wahres (true) Geschlecht definiert wird Zwinkerndes Smiley. Um aus dem boolschen Wert einen Text zu erhalten benötigt man dann noch einen Converter. Für die Gruppierung muss eine CollectionViewSource zwischen geschaltet werden. Beides per Deklaration im Resources Bereich.

 <UserControl.Resources>
        <my:conv1 x:Key="fmConverter"/>
        <CollectionViewSource
            x:Name="cvs1"
             IsSourceGrouped="true"
             >
          </CollectionViewSource>
 </UserControl.Resources>

Ganz wichtig ist das Attribut isSourceGrouped.

Um diese Gruppe zu erzeugen wird ein LINQ Statement zwischen geschaltet. Dort gibt es die Möglichkeit zu gruppieren mit Groub py.

Dim pers = New personen
Dim q = From p In pers
       Group p By key = p.sex Into g = Group
       Select New GroupInfo(Of Boolean, person)(key, g)
 cvs1.Source = q

Hier fallt natürlich auf, das die erzeugten Daten mit den Ursprungsdaten wenig gemein haben. Die Gruppe wird in einer Liste vom Typ Groupinfo abgelegt.

Groupinfo ist eine eigene Klasse, die ich auch im wesentlichen kopiert habe um mir die aufwendige Implementierung des Codes zu ersparen.

Public Class GroupInfo(Of TKey, TItem) 'interface required to show grouped data
    Implements IGrouping(Of TKey, TItem)

    Private _source As IEnumerable(Of TItem)
    Private _key As TKey

    'takes a LINQ IGrouping and converts it to a GroupInfo
    Public Sub New(key As TKey, source As IEnumerable(Of TItem))
        _key = key
        _source = source
    End Sub

    Private Function IEnumerable_GetEnumerator() As System.Collections.IEnumerator
Implements System.Collections.IEnumerable.GetEnumerator Return _source.GetEnumerator End Function Public Function GetEnumerator() As IEnumerator(Of TItem) Implements IEnumerable(Of TItem).GetEnumerator Return _source.Cast(Of TItem).GetEnumerator() End Function Public ReadOnly Property key As TKey Implements IGrouping(Of TKey, TItem).Key Get Return _key End Get End Property End Class

Die fertige Windows 8 Anwendung

 image

Der XAML Code benötigt ein Template für die Gruppe und eines für die Listen Einträge. Im Headertemplate wird aus dem true oder false des Key per Converter ein Text.

<ListView HorizontalAlignment="Left"  Margin="20,10,0,0" VerticalAlignment="Top" Width="342"
                  ItemsSource="{Binding Source={StaticResource cvs1}}"  >
      <ListView.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <Grid Margin="7,7,0,0">
                                <Button   Content="{Binding key,Converter={StaticResource fmConverter}}" 
/> </Grid> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ListView.GroupStyle> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding name}" FontSize="20" Margin="10" FontWeight="Bold"/> <TextBlock Text="{Binding alter}" FontSize="20" Margin="10" FontWeight="Bold"/> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>

 

Zur Vollständigkeit halber der Converter.

Public Class conv1
    Implements IValueConverter


    Public Function Convert(value As Object, targetType As Type, parameter As Object, language As String) As 
Object Implements IValueConverter.Convert If value Then Return "maennlich" Else Return "weiblich" End If End Function Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, language As String) As
Object Implements IValueConverter.ConvertBack End Function End Class

Pingbacks and trackbacks (1)+

Kommentar schreiben