【问题标题】:Sorting a CollectionView's Groups on a property generated by IValueConverter根据 IValueConverter 生成的属性对 CollectionView 的组进行排序
【发布时间】:2011-03-22 21:24:40
【问题描述】:

我正在使用 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 实现 can be used,但我不知道如何:Compare() 方法接收成对的详细信息项,而不管它们的分组如何,此时我无法确定小计。

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

【问题讨论】:

    标签: wpf collectionviewsource


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多