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

标签 c# wpf xaml checkbox listbox

我是 C# 的新手,我遇到这个问题已经有一段时间了。我有一个名为“listBox”的 ListBox,它绑定(bind)到一个 Items 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());

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

最佳答案

理想情况下,您希望在集合中拥有一类数据对象,而不是 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;

现在当你绑定(bind)它时,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;

关于c# - 使用 wpf C# 获取 ListBox 中复选框的内容和 Items Collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34051731/

相关文章:

c# - LINQ to SQL - 从 X WHERE X = "1"选择 Y

c# - Thread.Interrupt 在应用程序关闭时停止长时间 sleep - 是否有更好的方法

c# - ComboBox 选择完成 MVVM 后强制绑定(bind)更新

xaml - 如何只为特定平台设置 OnPlatform?

ios - iOS 上的 Xamarin.Forms ListView ViewCell 问题

c# - 根据重量和值(value)将元素存储在 3 辆卡车中的遗传算法

c# - 如何在 Windows Phone 8 中实现深度链接

c# - 如果子窗口四处移动,WPF 主应用程序将停止响应

.net - 前台属性行为困惑

c# - 在 Windows 通用应用程序中调整复选框大小