2010-10-28 6 views
1

Am en cochant la case des éléments listbox, comment obtenir les cases sélectionnées dans la listeComment obtenir la sélection des produits dans WPF CheckBox ListBox

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

J'ai essayé de boucle à travers les éléments sélectionnés dans les listboxitems, mais throws exception dans ListBoxItem

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

Quelle est l'exception et à partir de quelle ligne est levée l'exception? –

Répondre

1

Demandez à votre modèle comme celui-ci

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

la n la liaison ci-dessus se synchronisera de deux façons avec vos modèles isSelected et list view selection, puis dans le code utilisez SelectedItems.

For Each s As myPoco In myListView1.SelectedItems 
    ' do something here with 
Next 
5

Vous pouvez déplacer le contexte de données pour chacun de ces éléments loin de l'interface utilisateur et créer un ObservableCollection d'objets

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

public class CheckedItem : INotifyPropertyChanged 
{ 
    private bool selected; 
    private string description; 

    public bool Selected 
    { 
    get { return selected; } 
    set 
    { 
     selected = value; 
     OnPropertyChanged("Selected"); 
    } 
    } 

    public string Description 
    { 
    get { return description; } 
    set 
    { 
     description = value; 
     OnPropertyChanged("Description"); 
    } 
    } 

    /* INotifyPropertyChanged implementation */ 
} 

Puis dans votre ListBox ItemTemplate

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

Vos articles sélectionnés sont désormais disponibles dans ObservableCollection plutôt que dans les éléments d'interface utilisateur

+0

Voici comment j'ai implémenté la même chose dans le passé +1. Un point mineur: vous pouvez implémenter 'INotifyPropertyChanged' sur votre' CheckedItem' dans le cas où une liaison bidirectionnelle est nécessaire. –

+0

D'accord sur INotifyPropertyChanged. Cela dépend vraiment de vos besoins – benPearce

0

Je suggérerais ce code:

private void save_Click(object sender, RoutedEventArgs e) 
{ 
    foreach (CheckBox item in list1.Items) 
    { 
     if (item.IsChecked) 
     { 
      MessageBox.Show(item.Content.ToString()); 
     } 
    } 
} 
Questions connexes