C# 标题中带有复选框的分组ListView
我有一个绑定到一些数据的ListView,它被分组和排序。我在分组标题中添加了一个复选框,如下所示:C# 标题中带有复选框的分组ListView,c#,wpf,listview,checkbox,grouping,C#,Wpf,Listview,Checkbox,Grouping,我有一个绑定到一些数据的ListView,它被分组和排序。我在分组标题中添加了一个复选框,如下所示: <ListView.GroupStyle> <GroupStyle> <GroupStyle.ContainerStyle> <Style TargetType="{x:Type GroupItem}">
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">
<Expander.Header>
<DockPanel>
<CheckBox>
<StackPanel Orientation="Horizontal">
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0"/>
<TextBlock Text=" ("/>
<TextBlock Text="{Binding Path=ItemCount}"/>
<TextBlock Text=" Items)"/>
</StackPanel>
</CheckBox>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
现在,我只关心并需要一种方法来循环检查已检查标题的分组项目,实现这一点的最佳方法是什么?遗憾的是,这并不像需要的那样简单 请记住,组的标题
复选框
有一个数据上下文
,这是一种称为GroupItem
的特殊对象。在此GroupItem
中有Name
属性,该属性是组表示的值,即分组所基于的公共值
许多人将此与组描述属性混淆,例如,假设您在员工的集合视图中添加了带有属性EmployeeStatus
的GroupDescription
,然后,GroupItem.Name
不是EmployeeStatus
,而是创建组时所依据的值,例如Present
,缺席
,OnLeave
等
有了这些知识,让我们试着去实现你所追求的
我们将标题复选框命名为“HeaderCheckBox”
在处理程序HandleButtonClick
中,我们执行以下代码
private void HandleCheckBoxClick(object sender, RoutedEventArgs e)
{
var checkBox = e.OriginalSource as CheckBox;
if (checkBox != null && checkBox.Name == "HeaderCheckBox")
{
var groupItem = checkBox.DataContext as GroupItem;
//// Assuming MyItem is the item level class and MyGroupedProperty
//// is the grouped property that you have added to the grouped
//// description in your CollectionView.
foreach (MyItem item in groupItem.Items)
{
//// Place your code for the items under that particular group.
}
}
}
可悲的是,这是实现你所追求的目标的唯一途径。如果您使用的是MVVM,那么整个代码都必须通过附加的行为来完成
如果有帮助,请告诉我。是的,谢谢,我可以将其转化为有效的解决方案。然而,我实际上只是在寻找一种方法,在填充列表后,通过选中标题复选框来获取组列表。然而,使用您的代码,我可以将一个带有复选框的不可见列作为正在显示的类的成员,并根据已选中的组控制复选框,然后很容易找到哪些项已选中,哪些项未选中。再次感谢你!您可以获取所有组,我认为列表视图
公开项目
属性。。。我想应该有单独的小组。。。。这是一个新手的猜测,它可能不会让你赢得德比在.NET 4中,它不是GroupItem,而是CollectionViewGroup
<ListView Button.Click="HandleCheckBoxClick" ...>
private void HandleCheckBoxClick(object sender, RoutedEventArgs e)
{
var checkBox = e.OriginalSource as CheckBox;
if (checkBox != null && checkBox.Name == "HeaderCheckBox")
{
var groupItem = checkBox.DataContext as GroupItem;
//// Assuming MyItem is the item level class and MyGroupedProperty
//// is the grouped property that you have added to the grouped
//// description in your CollectionView.
foreach (MyItem item in groupItem.Items)
{
//// Place your code for the items under that particular group.
}
}
}