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 . 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
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