如何在 WPF CheckBox ListBox 中获取选定项目

Posted

技术标签:

【中文标题】如何在 WPF CheckBox ListBox 中获取选定项目【英文标题】:How to get Selected items in WPF CheckBox ListBox 【发布时间】:2011-05-01 15:53:45 【问题描述】:

在列表框项目中使用复选框,如何从列表中获取选中的复选框

<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());
            
        
    

【问题讨论】:

什么是异常,从哪一行抛出异常? 【参考方案1】:

您可以将每个项目的数据上下文从 UI 中移开并创建一个 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 中可用,而不是在 UI 元素中循环

【讨论】:

这就是我在过去 +1 中实现相同的方式。一个小问题:您可能希望在您的CheckedItem 上实现INotifyPropertyChanged,以防需要双向绑定。 同意 INotifyPropertyChanged。这确实取决于您的要求【参考方案2】:

让你的模板像这样

<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

【讨论】:

【参考方案3】:

我会建议这个代码:

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

【讨论】:

以上是关于如何在 WPF CheckBox ListBox 中获取选定项目的主要内容,如果未能解决你的问题,请参考以下文章

在wpf中,listbox中可以添加checkbox吗

动态设置 ListBox CheckBox 内容

WPF怎么用代码实现ListBox控件的多行选择

WPF:如何在调整大小后保持 ListBox SelectedItem 可见?

如何在 WPF 中的 ListBox 上添加标签?

如何在WPF中的ListBox上添加标签?