如何在后面的代码中查询列表框中的复选框?
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.Items
或 ListBox
的源集合,而应创建包含 属性 的 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) });
然后 ListBox
的 ItemTemplate
可以用来定义 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);
我有以下列表框:
<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.Items
或 ListBox
的源集合,而应创建包含 属性 的 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) });
然后 ListBox
的 ItemTemplate
可以用来定义 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);