c# - ListView分组和选择

标签 c# wpf

我有一个绑定(bind)到对象集合的 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 中添加了一个复选框以供选择。使用组标题中的复选框,我想选择整个组。 对于上面的示例,如果我检查标题“Banana”,则会检查同一组中下面的 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>   

我该怎么做?

提前致谢。

最佳答案

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

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

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

    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 属性。

关于c# - ListView分组和选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512531/

相关文章:

c# - 使用 XMLDocument C# xml 添加多个节点

c# - 当传递给另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?

c# - 如何使用 BinaryWriter 编写列表?

c# - 分布式窗口服务

wpf - 如何在 Composite WPF 中将按键与 DelegateCommand 相关联?

c# - 在哪里使用 EF6 订阅 ObjectMaterialized?

c# - 如何在WPF中获取图像的正确位置?

c# - .NET 4.5 的奇怪文本框问题 - 不允许 '.'

c# - 如何使 WPF 窗口标题的文本长度大于 255 个字符?

WPF - 无法停止动画 StoryBoard,IsControllable 不起作用?