Silverlight Multiselect Listbox
The Listbox control of Silverlight 2 have no multi selection. Datagrid have! I want to show how to build a Listbox with Checkboxes and iterate at the end through all items an see if they are checked. Seams to be easy!?
But isn't. You can not access the content of the datatemplate. One solution is to use visualtreehelper to iterate through all controls of controltree. That is quite complkicated cause e.g a checkbox is a composition of Textblock and Rectangle.
I show the databinding way which is quite cool
First I have to generate a class where all data is in and a additional field for the checked value.
Imports System.ComponentModel Imports System.Collections.ObjectModel Public Class Listboxdaten Implements INotifyPropertyChanged Private _checked As Boolean Public Property checked() As Boolean Get Return _checked End Get Set(ByVal value As Boolean) _checked = value OnPropertyChanged("checked") End Set End Property Private _daten As String Public Property daten() As String Get Return _daten End Get Set(ByVal value As String) _daten = value OnPropertyChanged("daten") End Set End Property Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged Protected Sub OnPropertyChanged(ByVal name As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) End Sub End Class
I dont like the typing, but that is another story. Now comes the cool part in XAML. The trick is to do a two way binding.
<ListBox x:Name="lstFields" SelectionChanged="lstFields_SelectionChanged" > <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" x:Name="stack1"> <CheckBox x:Name="chkFields" IsChecked="{Binding checked, Mode=TwoWay}"></CheckBox> <TextBlock Text="{Binding daten}"></TextBlock> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Button x:Name="Button1" Width="30" Height="20" Click="Button1_Click"></Button>
A little bit code to fill the data onload
Private Sub page17_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded lstFields.Items.Add(New Listboxdaten With {.checked = True, .daten = "eins"}) lstFields.Items.Add(New Listboxdaten With {.checked = True, .daten = "zwei"}) lstFields.Items.Add(New Listboxdaten With {.checked = True, .daten = "drei"})
A little bit more code to get the items an see if it is checked
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) For Each i In lstFields.Items If CType(i, Listboxdaten).checked Then MessageBox.Show("checked") End If Next End Sub
Do you like it? Feel free to comment