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。実装CustomSortを取る ListCollectionView のプロパティをこのような状況で使用できるという提案を見てきましたが、方法がわかりません。メソッドは、グループ化に関係なく、詳細項目のペアを受け取ります。その点。IComparerCompare()

これらのグループを独自のエンティティにする必要なく、これらのグループを並べ替える方法はありますか (つまり、概要レベルで CollectionView を持ち、詳細レベルで別の CollectionView を持つ)。

4

1 に答える 1

0

ItemsControl に表示されるグループの順序は、コレクションのアイテムの並べ替え順序によって決定されると思います。

したがって、通常、最初にグループ化プロパティで並べ替え、次にグループ内で達成したい順序で並べ替えます...

あなたのケースでは、グループを別のプロパティ (つまり、そのグループ内のアイテムの合計) で並べ替えたいと考えています。これを簡単に行う唯一の方法は、項目に新しいプロパティを追加することです。これにより、各グループの合計 (または必要な順序に基づいて任意の並べ替えキー) が返されます。次に、そのプロパティでコレクションを並べ替えることができます。これにより、必要なグループの順序が得られます。

コレクション内の各アイテムのグループの合計を設定/計算する必要があり、実際にはコードでグループ化を計算する必要があるため、これはそれほど効率的でもエレガントでもないようです。しかし、私はより良い方法を知りません。

于 2013-11-11T19:11:04.253 に答える