3

我有一个绑定到对象集合的 ListView。根据用户的选择,对象按其属性分组。

例如,我有水果的基本集合(品种、数量、产地):

Banana, 10, Africa
Apple, 2, France
Pear, 30, France
Banana, 40, Africa

变成,按水果种类分组:

Banana
    Banana, 10, Africa
    Banana, 40, Africa

Apple
    Apple, 2, France

Pear
    Pear, 30, France

对于每个对象和组标题,我在 XAML 中添加了一个复选框以供选择。使用组标题中的复选框,我想选择整个组。对于上面的示例,如果我检查标题“香蕉”,则检查同一组中的以下 2 行。

这是我的 ListView 的 XAML:

<ListView Name="MyCollectionView" ItemsSource="{Binding}" SelectionMode="Multiple">
  <ListView.GroupStyle>
    <GroupStyle>
      <GroupStyle.HeaderTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <CheckBox Name="SelectAllGroup" />
            <TextBlock Text="{Binding Name}" Margin="10,0,0,0" />
          </StackPanel>
        </DataTemplate>
      </GroupStyle.HeaderTemplate>
    </GroupStyle>
  </ListView.GroupStyle>

  <ListView.View>
    <GridView>
      <GridViewColumn Width="Auto" Header="Sélection" >
       <GridViewColumn.CellTemplate>
         <DataTemplate>
           <CheckBox Margin="0" VerticalAlignment="Center" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/>
         </DataTemplate>
       </GridViewColumn.CellTemplate>
     </GridViewColumn>
     <GridViewColumn Width="Auto" Header="N°" DisplayMemberBinding="{Binding Path=Numero}"/>
     <GridViewColumn Width="Auto" Header="Nom" DisplayMemberBinding="{Binding Path=Nom}" />
     <GridViewColumn Width="Auto" Header="Responsable" DisplayMemberBinding="{Binding Path=Responsable}" />
     <GridViewColumn Width="Auto" Header="Détail" DisplayMemberBinding="{Binding Path=Detail}" />
     <GridViewColumn Width="Auto" Header="Calibre" DisplayMemberBinding="{Binding Path=Calibre}" />
    </GridView>
  </ListView.View>
</ListView>   

我怎样才能做到这一点 ?

提前致谢。

4

1 回答 1

0

我做了一些与此非常相似的事情,将命令放在标题中的复选框上,然后在命令方法中,如下所示:

private void UpdateSelectedFruitGroup()
{
    MyFruitCollection.Where(f => f.Variety == "Banana").ForEach(f => f.IsSelected = true);
}

为了执行 ForEach,您需要将此 Extension 放入静态类中:

    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        if (enumerable == null)
            throw new ArgumentNullException("enumerable");

        if (action == null)
            throw new ArgumentNullException("action");

        foreach (var e in enumerable)
        {
            action(e);
        }
    }

基本上它只是遍历集合中的每个项目并对其执行操作。在这种情况下,它设置 IsSelected 属性。

于 2012-09-20T13:06:06.477 回答