1

我正在使用 CollectionViewSource 的分组来显示详细信息集合的虚拟“聚合”视图;基本上是这里看到的示例:ListBox Grouping, Sorting, Subtotals and Collapsible Regions

总结示例的相关部分,您的分组可以通过 ValueConverter 从其详细信息中公开聚合属性,如下所示:

<ListBox.GroupStyle>
  <GroupStyle>
    <GroupStyle.ContainerStyle>
      <Style TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
              <Grid>
                <!--[..Snip..]-->
                  <TextBlock Grid.Column="4"
                             Text="{Binding StringFormat=\{0:C\},
                             Converter={StaticResource groupItemSalesSubtotalConverter}}"
                             TextAlignment="Right" />
                <!--[..Snip..]-->
              </Grid>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </GroupStyle.ContainerStyle>
  </GroupStyle>
</ListBox.GroupStyle>

请注意,上面的 TextBlock 直接绑定到 GroupItem 的绑定,因此转换器接收整个CollectionViewGroup及其子项,并且可以深入了解详细信息以汇总组中项目的小计。

问题是,由于这个值本身不是一个属性,是否可以按小计对组进行排序?

这显然不能由SortDescription. 我已经看到有关 ListCollectionView 的CustomSort属性的建议,它需要一个IComparer实现,可以在这样的情况下使用,但我不明白如何:该Compare()方法接收成对的细节项,无论它们的分组如何,我无法确定小计那一点。

有什么方法可以对这些组进行排序,而无需使它们本身成为实体(即在摘要级别有一个 CollectionView,在详细级别有另一个 CollectionView)?

4

1 回答 1

0

我相信 ItemsControl 中显示的组的顺序由集合的项目排序顺序决定。

因此,通常,您首先按分组属性排序,然后按您希望在组内实现的顺序...

在您的情况下,您想按另一个属性对组进行排序(即,如果该组中的项目总和)。我知道轻松做到这一点的唯一方法是向项目添加一个新属性,该属性返回每个组的总和(或任意排序键,基于所需的顺序)。然后,您可以按该属性对集合进行排序,这将为您提供所需的组排序。

这似乎不是非常有效或优雅,因为您需要为集合中的每个项目设置/计算组的总和,实际上是在代码中计算分组。但是,我不知道更好的方法。

于 2013-11-11T19:11:04.253 回答