我有一个ListView绑定到某些数据,它被分组和排序。我在分组标题中添加了一个复选框,如下所示:
<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>
现在我只关心并需要一种方法来遍历已检查标题的分组项目,实现此目的的最佳方法是什么?
答案 0 :(得分:1)
可悲的是,它并不像它需要的那样简单,
请注意,群组标题CheckBox
有DataContext
,这是一种称为GroupItem
的特殊对象。在此GroupItem
中,存在Name
属性,该属性是该组所代表的值,即基于哪个分组发生的公共值。
很多人将此与群组描述属性混淆,例如假设您在GroupDescription
个员工中添加了EmployeeStatus
个属性CollectionView
,那么GroupItem.Name
不是EmployeeStatus
,但它实际上是哪个组的值已创建,例如Present
,Absent
,OnLeave
等。
有了这些知识,我们就试着去实现你想要的......
我们将标题复选框命名为“HeaderCheckBox”
<CheckBox x:Name="HeaderCheckBox" ...>
我们在ListView级别处理Button.Click
(一个冒泡的附加事件)。
<ListView Button.Click="HandleCheckBoxClick" ...>
在处理程序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,则必须通过附加行为完成整个代码。
如果有帮助,请告诉我。