views:

58

answers:

2

Am Using the checkbox in listbox items, how to get the selected checkboxes from the list

<ListBox ItemsSource="{Binding NameList}"  HorizontalAlignment="Left" Margin="16,68,0,12" Name="listBox1" Width="156" IsEnabled="True" SelectionMode="Multiple" Focusable="True" IsHitTestVisible="True" IsTextSearchEnabled="False" FontSize="12" Padding="5" SelectionChanged="listBox1_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate> 
                        <StackPanel Orientation="Horizontal">                      
                               <CheckBox Content="{Binding Path=CNames}" />
                        </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

I tried to loop thru the selected items in the listboxitems, but it throws exception in listboxitem

 private void btnSelected(object sender, RoutedEventArgs e)
    {
        foreach (ListBoxItem item in listBox1.Items)
        {
            if (item.ToString() == "true")
            {
                MessageBox.Show(item.Content.ToString());
            }
        }
    }
A: 

Have your template like this

<ListBox.ItemTemplate>
   <DataTemplate> 
 ........
   <CheckBox Content="" 
      IsChecked="{Binding IsSelected, Mode=TwoWay,
      RelativeSource={RelativeSource FindAncestor, 
      AncestorType={x:Type ListViewItem}}}"  />
 ..........
    <!-- Use Other UIElements to Show your Data -->

then the above binding will sync two way with your models isSelected and list view selection, then in code use SelectedItems.

For Each s As myPoco In myListView1.SelectedItems
   ' do something here with
Next
+1  A: 

You could move the data context for each of these items away from the UI and create an ObservableCollection of objects

public ObservableCollection<CheckedItem> List { get;set;}

public class CheckedItem
{
  public bool Selected { get; set; }
  public string Description { get; set; }
}

Then in your ListBox ItemTemplate

<ItemTemplate>
  <DataTemplate>
    <CheckBox IsChecked="{Binding Path=Selected}" Content={Binding Path=Description}"/>
  </DataTemplate>
</ItemTemplate>

Your selected items are now available in the ObservableCollection rather than looping through UI elements

benPearce
This is how I have implemented the same in the past +1. One minor point: you may want to implement `INotifyPropertyChanged` on your `CheckedItem` in case two way binding is needed.
Steve Greatrex
Agreed on INotifyPropertyChanged. It does really depend on your requirements
benPearce