我构建了一个简单的视图模型,它填充了一个可观察的集合,并以复选框的形式显示列表。我想获取“已检查”的项目列表,当然如果未选中则从列表中删除。调试显示正在选择的对象,但如何将此信息发送到列表以供进一步使用?
public class CheckBoxListItem
{
public bool Checked { get; set; }
public string Text { get; set; }
}
ObservableCollection<CheckBoxListItem> monthlyResults =
new ObservableCollection<CheckBoxListItem>();
public ObservableCollection<CheckBoxListItem> MonthlyResults
{
get { return monthlyResults; }
set
{
monthlyResults = value;
base.OnPropertyChanged("StringList");
}
}
Dictionary<int, CheckBoxListItem> ResultsDict = new Dictionary<int, CheckBoxListItem>();
public List<string> outputlist = new List<string>();
public List<bool> outputyesnolist = new List<bool>();
outputlist.Add("Canon");
outputlist.Add("Sony");
outputlist.Add("Nikon");
outputyesnolist.Add(false);
outputyesnolist.Add(false);
outputyesnolist.Add(false);
for (int j = 0; j < outputlist.Count; j++)
{
CheckBoxListItem list1 = new CheckBoxListItem();
list1.Text = outputlist[j];
list1.Checked = outputyesnolist[j];
ResultsDict[j] = list1;
}
foreach (var value in ResultsDict.Values)
{
model.MonthlyResults.Add(value);
}
XAML定义为:
<ListBox x:Name="Listitems" Grid.Column="2" SelectionMode="Multiple" ItemsSource="{Binding MonthlyResults}" >
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Text}"
IsChecked="{Binding Checked ,Mode=TwoWay}"
Click="CheckBox_Click"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
点击Checkbox_Click
的部分
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
var cb = sender as CheckBox;
var item = cb.DataContext;
Listitems.SelectedItem = item;
}
答案 0 :(得分:2)
假设所有绑定都设置正确,您应该可以通过查看MonthlyResults
中的项目来搜索所有选中的项目:
var checkedItems = MonthlyResults.Select(item => item.Checked);
然后checkedItems
将只包含已检查的项目。
如果尚未编译,请将using System.Linq;
添加到源文件的顶部。
答案 1 :(得分:1)
感谢Andy。我修改了他的答案
var checkedItems1 = MonthlyResults.Where(B => B.Checked == true);
访问组件:
foreach(var obj in checkedItems1)
{
var hello = obj.Text;
}