【问题标题】:How can I query the checkboxes from my list box in the code behind?如何在后面的代码中从我的列表框中查询复选框?
【发布时间】:2021-06-24 12:26:28
【问题描述】:

我有以下列表框:

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

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

【问题讨论】:

  • 由于您使用的是 2 路绑定,因此在项目模型中您应该能够读取它...所以迭代 Items 并检查选择了哪些(通过 IsSelected 属性)
  • @WPFHelp:来自视图的代码隐藏还是来自视图模型? Items 是如何定义的?它是什么类型的?
  • 你能给我一个 C# 示例,说明我需要如何在后面的代码中编写它以将每个 Checked Item 添加到 List 中吗?
  • @mm8 我猜我没有定义项目
  • 那么ItemsSource="{Binding Items}"是什么?

标签: c# wpf xaml data-binding


【解决方案1】:

不要将string 值添加到tbxFiles.ItemsListBox 的源集合,您应该创建一个类,该类包含一个显示名称的属性和另一个确定当前是否检查项目的属性:

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

然后您将此类的实例添加到 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);

【讨论】:

  • 好的,现在我得到了这个 var selectedItem 但我现在如何删除所有选中的列表框字段?
  • 这是另一个问题,不是吗?您可以遍历selectedItems.ToArray() 并从列表tbxFiles.Items 中删除每个项目。
  • 当我创建断点时,在 selectedItems 中只有这个值:{System.Linq.Enumerable.WhereSelectEnumerableIterator} 但不是我检查的值的字符串。即使我没有检查一个项目,他们也站在那里
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2021-08-25
  • 2012-04-17
  • 2017-11-05
相关资源
最近更新 更多