我对C#很陌生,我现在已经有一段时间没遇到这个问题了。我有一个名为" listBox"的ListBox。它绑定到一个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());
非常感谢任何帮助。
答案 0 :(得分:3)
您理想的是在集合中拥有一类数据对象,而不是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;