【问题标题】:how to set checkbox in listbox for specific item in listbox C# WPF如何在列表框中为列表框中的特定项目设置复选框 C# WPF
【发布时间】:2016-06-06 21:21:16
【问题描述】:

我有一个如下的列表框:

    <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="385" Margin="21,138,0,0" VerticalAlignment="Top" Width="273" ItemsSource="{Binding Path=locationList}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Button Name="btnDelete" Click="btnDelete_Click" Width="15" Height="15" HorizontalAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Content="x" />
                    <CheckBox Name="checkBox" />
                    <TextBlock Name="textBox" Text="{Binding}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我想做的是为这个列表框的特定项目设置复选框。

我正在尝试这样做:

    private void button4_Click(object sender, RoutedEventArgs e)
    {
        for(int i = 0; i < listBox.Items.Count; i++)
        {
            listBox.Items[i].checkBox = false;
        }
    }

我知道我做错了。我想将其转换为项目对象,然后将项目的属性(此复选框)设置为 false。有人可以纠正我吗?提前谢谢你。

编辑

在我尝试这样做之前:

        foreach (var item in listBox.SelectedItems)
        {
            item.
        }

但我得到的所有可能性都只是标准方法:Equals、GetHashCode、GetType、ToString...我如何引用复选框?

此外,我将为我的问题提供见解。我想通过文本在列表框(项目)中查找特定项目,然后更改该项目的复选框(列表框中的同一行)。 要实现的第二个逻辑是将所有行设置为选中或未选中(这是我现在要做的)。

感谢您的回复。

【问题讨论】:

  • ListBox 你应该改变你的 for 循环以使用 foreach 例如foreach(var item in listBox.SelectedItems) 类似的东西..
  • 感谢您抽出宝贵时间 :) 我已编辑帖子作为您的答案。
  • 不幸的是,这并没有解决我的问题,因为它适用于 Windows 窗体,并且我使用的是 wpf,但我没有文章中的属性。一般来说,我有列表框标准,它看不到清单或类似的东西。我已经在帖子中展示了上面列表框的构造。问候
  • 做一个简单的谷歌搜索来谷歌下面how to set CheckedListBox items to unchecked C# WPF

标签: c# wpf checkbox listbox


【解决方案1】:
        for (int i = 0; i < listBox.Items.Count; i++)
        {
            var item = listBox.ItemContainerGenerator.ContainerFromItem(listBox.Items[i]) as ListBoxItem;
            var template = item.ContentTemplate as DataTemplate;

            ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(item);

            CheckBox myCheckBox = (CheckBox)template.FindName("checkBox", myContentPresenter);

            myCheckBox.IsChecked = true;
        }

同样,您可以找到 TextBlock(注意,您将其命名为“textBox”而不是“textBlock”)

            TextBlock myTextBlock = (TextBlock)template.FindName("textBox", myContentPresenter);

FindVisualChild 可以在这里找到FindVisualChild reference issue

【讨论】:

  • 嘿,这就像一个魅力 :) 直到第 21 项总是导致消息错误:“对象引用未设置为对象的实例。”。作为我的 itemSource,我有 List。 21 项并不特殊,没有特殊字符或任何东西。我正在考虑为此编写一个小模型,一个包含我的字符串和布尔值的类,或者将其设为 List>。顺便说一句,您知道为什么会发生此异常吗?无论如何,你的提议很棒。它向我解释了一些 wpf 的复杂性。
  • @jankowalski 问题是第 21 项尚未创建。您可以通过滚动到最后一项来创建它。或者将此添加到您的 ListBox VirtualizingPanel.IsVirtualizing="False"。
  • 您对 WPF 的了解给我留下了深刻的印象。祝你一切顺利。非常感谢您帮助我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2016-03-07
  • 2020-06-27
相关资源
最近更新 更多