2011-09-06 77 views
0

我有一个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> 

现在我只关心并需要通过有头检查分组的项目的方式来循环,什么是完成这一任务的最好方法是什么?

回答

1

可悲的是它不是那么简单,因为它需要,

请记住,一个组的头CheckBoxDataContext这是一个特殊的对象称为GroupItem。在这个GroupItem中有Name属性,它是该组所表示的值,即基于哪个分组发生的共同值。

很多人将此与组描述属性混淆,例如假设你已经在你的员工CollectionView添加属性EmployeeStatus一个GroupDescription,然后GroupItem.Name不是EmployeeStatus,但它实际上是在哪一组创建如PresentAbsentOnLeave

有这方面的知识,让价值努力实现你追求什么......

  1. 我们命名头复选框,说 “HeaderCheckBox”

    <CheckBox x:Name="HeaderCheckBox" ...> 
    
  2. 我们在ListView级别处理Button.Click(冒泡附加事件)。

    <ListView Button.Click="HandleCheckBoxClick" ...> 
    
  3. 在处理程序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,那么整个代码将不得不通过附加的行为来完成。

让我知道这是否有帮助。

+0

是的,谢谢你,我可以把它变成一个可行的解决方案。然而,我真的只是在列表填充之后寻找一种方法来获取包含选项框复选框的组列表。相反,不管使用你的代码,我只需要一个带有复选框的不可见列作为正在显示的类的成员,并根据哪个组已被选中来控制复选框,然后很容易找到哪些项目被检查,哪些不是。再次感谢你! – acat13

+0

你可以得到所有组,我认为'ListView'暴露了'Items'属性...我想这应该有个别组....这是一个新人猜测,它可能不会赢得你的德比。 :-) –

+1

在.NET 4中,它不是GroupItem,而是CollectionViewGroup – SACO