2010-10-28 2 views
1

Am С помощью флажка в пунктах ListBox, как получить выбранные флажки из спискаКак получить выбранные элементы в 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> 

Я попытался петлю через выбранные элементы в listboxitems, но бросками исключение ListBoxItem

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

Какое исключение и из какой строки вы выбрали исключение? –

ответ

1

Пусть ваш шаблон, как этот

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

в n вышеупомянутое связывание синхронизирует два пути с вашими моделями: выбор и выбор списка, а затем в коде используйте SelectedItems.

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

Вы можете переместить контекст данных для каждого из этих элементов далеко от пользовательского интерфейса и создать ObservableCollection объектов

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 */ 
} 

Затем в ListBox ItemTemplate

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

Выбранные элементы теперь доступны в ObservableCollection, а не зацикливание через элементы пользовательского интерфейса

+0

Вот как я реализовал то же самое в прошлом +1. Один второстепенный момент: вы можете захотеть внедрить 'INotifyPropertyChanged' в свой' CheckedItem' в случае необходимости двусторонней привязки. –

+0

Согласовано с INotifyPropertyChanged. Это действительно зависит от ваших требований – benPearce

0

Я бы предложил этот код:

private void save_Click(object sender, RoutedEventArgs e) 
{ 
    foreach (CheckBox item in list1.Items) 
    { 
     if (item.IsChecked) 
     { 
      MessageBox.Show(item.Content.ToString()); 
     } 
    } 
} 
Смежные вопросы