Как получить выбранные элементы в WPF CheckBox ListBox - PullRequest
1 голос
/ 28 октября 2010

Am Используя флажок в элементах списка, как получить выбранные флажки из списка

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

Я пытался зациклить выбранные элементы в элементах списка, но он выдает исключение в элементе списка

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

Ответы [ 3 ]

5 голосов
/ 28 октября 2010

Вы можете переместить контекст данных для каждого из этих элементов из пользовательского интерфейса и создать коллекцию объектов 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>
  <DataTemplate>
    <CheckBox IsChecked="{Binding Path=Selected}" 
              Content={Binding Path=Description}" />
  </DataTemplate>
</ItemTemplate>

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

1 голос
/ 28 октября 2010

Сделайте так, чтобы ваш шаблон был таким

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

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

For Each s As myPoco In myListView1.SelectedItems
   ' do something here with
Next
0 голосов
/ 21 ноября 2017

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

 private void save_Click(object sender, RoutedEventArgs e)
 {
     foreach (CheckBox item in list1.Items)
     {
         if (item.IsChecked)
         {
             MessageBox.Show(item.Content.ToString());
         }
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...