如何在后面的代码中查询列表框中的复选框?

How can I query the checkboxes from my list box in the code behind?

我有以下列表框:

<ListBox Grid.Column="0" BorderBrush="Black" Margin="15,20,122,15" MinHeight="25" Name="tbxFiles"
             VerticalAlignment="Stretch"
             ItemsSource="{Binding Items}"
             SelectionMode="Multiple" Grid.ColumnSpan="2">
                <ListBox.Resources>
                    <Style TargetType="ListBoxItem">
                        <Setter Property="OverridesDefaultStyle" Value="true" />
                        <Setter Property="SnapsToDevicePixels" Value="true" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ListBoxItem">
                                    <CheckBox Margin="5,2"
                                      IsChecked="{Binding IsSelected,RelativeSource={RelativeSource TemplatedParent}}">
                                        <ContentPresenter />
                                    </CheckBox>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.Resources>
            </ListBox>

如您所见,我为列表框中的每个项目创建了一个复选框。但是现在我希望在单击按钮时将每个选中的 CheckBox 的 ListBox 项目的文本打包到列表中。由于我不太熟悉绑定,我想问一下如何从后面的代码中使用 IsChecked 绑定访问它?

不应将 string 值添加到 tbxFiles.ItemsListBox 的源集合,而应创建包含 属性 的 class ] 用于显示名称,另一个 属性 确定当前是否选中该项目:

public class Item
{
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 
}

然后将此 class 的实例添加到 ListBox(或其源集合,具体取决于您是否使用绑定和 MVVM):

tbxFiles.Items.Add(new Item() { Name = System.IO.Path.GetFileName(filename) });

然后 ListBoxItemTemplate 可以用来定义 Item 的外观:

<ListBox Grid.Column="0" BorderBrush="Black" Margin="15,20,122,15" MinHeight="25" Name="tbxFiles"
             VerticalAlignment="Stretch"
             SelectionMode="Multiple" Grid.ColumnSpan="2">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Name}"
                      IsChecked="{Binding IsSelected}" />
        </DataTemplate>
        </ListBox.Resources>
</ListBox>

获取当前选定的项目就像遍历源集合一样简单:

var selectedItems = tbxFiles.Items.OfType<Item>()
   .Where(x => x.IsSelected)
   .Select(x => x.Name);