2013-10-08 2 views
1

У меня есть этот флажок Список и я хочу, чтобы искать его элементов, которые были выбраны (IsChecked = истина) пользователемWPF Получить CheckBoxes внутри ListBox в коде

<CheckBox Style="{StaticResource ResourceKey=CheckBoxes}" 
    Name="chkBoxSelectAllStaff" Content="Select All">             
    </CheckBox> 


<ListBox Name="lstStaffs" MaxHeight="250" MinHeight="50" Margin="0,5,5,5" Width="350" 
ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalAlignment="Right"  
HorizontalContentAlignment="Right"> 

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Style="{StaticResource ResourceKey=CheckBoxes}" IsChecked="{Binding ElementName=chkBoxSelectAllStaff, Mode=OneWay, Path=IsChecked}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding FirstName}" Margin="0,0,3,0"></TextBlock> 
       <TextBlock Text="{Binding LastName}" Margin="0,0,3,0"></TextBlock> 
       <TextBlock Text="{Binding CellphoneNumber}" Margin="0,0,3,0"></TextBlock> 
      </StackPanel> 
     </CheckBox> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Я хочу сделать что-то вроде этого

foreach(var item in lstStaff.Items){ 
    if((CheckBox) item).IsChecked){ 
      //do something 
    } 
} 

А также я привязки данных таким образом:

//staff is my entity object containing Id, FirstName, LastName, CellphoneNumber 
lstStaffs.ItemsSource = args.Result; // comes from webservice call and is Staff[] 
lstStaffs.UpdateLayout(); 

Но я Посох объект в lstStaffs.Items !!, Так хо ж я могу перебрать выбранных (IsChecked = TRUE) элементов (штабы) ...

TNX

+0

Если вы хотите получить выбранные элементы, вам необходимо использовать свойство SelectedItems – Sasha

ответ

3

С How to: Find DataTemplate-Generated Elements страницы в MSDN:

// Getting the currently selected ListBoxItem 
// Note that the ListBox must have 
// IsSynchronizedWithCurrentItem set to True for this to work 
ListBoxItem myListBoxItem = (ListBoxItem)(myListBox.ItemContainerGenerator. 
    ContainerFromItem(myListBox.Items.CurrentItem)); 

// Getting the ContentPresenter of myListBoxItem 
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem); 

// Finding textBlock from the DataTemplate that is set on that ContentPresenter 
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; 
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", 
    myContentPresenter); 

// Do something to the DataTemplate-generated TextBlock 
MessageBox.Show("The text of the TextBlock of the selected list item: " 
    + myTextBlock.Text); 

Это показывает, как получить доступ к элементам определенном в DataTemplate. Тем не менее, если вы просто хотите, чтобы получить доступ к элементам из коллекции, которые были выбраны, есть гораздо более простой способ:

var selectedItems = lstStaffs.SelectedItems; 

Вы должны установить SelectionMode в Multiple или Extended для этой работы.

+0

Вы также можете отключить виртуализацию, иначе 'ContainerFromItem()' вернет 'null' на невидимые элементы. –

Смежные вопросы