使用wpf C#获取ListBox中的复选框和Items Collection的内容

本文关键字:Items Collection 复选框 使用 获取 ListBox wpf | 更新日期: 2023-09-27 18:25:33

我对C#还很陌生,这个问题已经有一段时间了。我有一个名为"ListBox"的ListBox,它绑定到一个Items Collection,该Collection有100多个复选框,每个复选框都有不同的内容(或复选框标签)。

我正在尝试循环浏览每个复选框,如果选中了,则将内容打印到控制台中。我能够检测是否检查了某些东西,但这绝对不是最有效的方法。请参阅下面的代码:

private void SomeButton_Click(object sender, RoutedEventArgs e)
    {
        string checkState = "";
        for (int i = 0; i < listBox.Items.Count - 1; i++)
        {
            checkState = listBox.Items[i].ToString().Substring(listBox.Items[i].ToString().Length - 5, 5);
            if (checkState != "False")
            {
                Console.WriteLine("Item " + i + " is checked");
            }
        }
    }

这段代码确实可以检测某些东西是否被检查或不正确。然而,如果我能够从ItemsCollection中的复选框中获得实际的true/false属性,那么效率会更高。我已经尝试了很多方法来尝试获得选中状态和复选框内容,但遗憾的是,每次尝试都会失败。以下是我试图从其中一个复选框中获取内容的一些内容:

Console.WriteLine(listBox.Items[i].ToString());

Console.WriteLine(listBox.Items.GetItemAt(i).ToString());

Console.WriteLine(listBox.Items.GetItemAt(i).Equals(0).ToString());

如有任何帮助,我们将不胜感激。

使用wpf C#获取ListBox中的复选框和Items Collection的内容

理想情况下,您希望在集合中有一类数据对象,而不是UI对象的集合。

public class MyDataObject : INotifyPropertyChanged
{
    public string Caption { get; set; }
    public bool IsChecked { get; set; }
}

var items = new ObservableCollection<MyDataObject>();
// TODO: populate collection
listBox.ItemsSource = items;

现在,当您绑定它时,listbox.Items包含您的ObservableCollection<MyDataObject>,您只需检查中的值

private void SomeButton_Click(object sender, RoutedEventArgs e)
{
    foreach(MyDataObject item in listBox.Items)
    {
        if (item.IsChecked)
            Console.WriteLine("Item " + item.Caption + " is checked");
    }
}

附带说明一下,如果不需要选择行为,ItemsControl可能比ListBox更适合一系列控件。XAML可能看起来像这样:

<ItemsControl x:Name="myItemsControl">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Caption}" Checked="{Binding IsChecked}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
var items = new ObservableCollection<MyDataObject>();
items.Add(new MyDataObject() { Caption = "A" });
items.Add(new MyDataObject() { Caption = "B" });
items.Add(new MyDataObject() { Caption = "C" });
items.Add(new MyDataObject() { Caption = "D" });
items.Add(new MyDataObject() { Caption = "E" });
myItemsControl.ItemsSource = items;