プロジェクトの1つにグループ小計行を持つハッキングされたDataGridがあります。列の非表示や並べ替えなど、あなたが提起する問題のいくつかについては心配していなかったので、それを拡張できるかどうかはわかりません。また、大きなセットで問題になる可能性のあるパフォーマンスの問題がある可能性があることも認識しています(私のウィンドウは32個の個別のDataGridを操作しています-痛いです)。しかし、それは私が見た他の解決策とは異なる方向なので、私はそれをここに投げて、それがあなたを助けるかどうか見ると思いました。
私のソリューションは、2つの主要なコンポーネントで構成されて
います。1。小計行は、メインのDataGridの行ではなく、個別のDataGridです。実際には、各グループに2つの追加グリッドがあります。1つはグループが折りたたまれているときにのみ表示されるヘッダーにあり、もう1つはItemsPresenterの下にあります。小計DataGridsのItemsSourceは、グループ内のアイテムを取得し、集約ビューモデルを返すコンバーターから取得されます。小計グリッドの列は、メイングリッドとまったく同じです(DataGrid_Loadedに入力されていますが、xamlでも実行できると確信しています)。
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander Background="Gray" HorizontalAlignment="Left" IsExpanded="True"
ScrollViewer.CanContentScroll="True">
<Expander.Header>
<DataGrid Name="HeaderGrid" ItemsSource="{Binding Path=., Converter={StaticResource SumConverter}}"
Loaded="DataGrid_Loaded" HeadersVisibility="Row"
Margin="25 0 0 0" PreviewMouseDown="HeaderGrid_PreviewMouseDown">
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}"
Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
</DataGrid>
</Expander.Header>
<StackPanel>
<ItemsPresenter/>
<DataGrid Name="FooterGrid" ItemsSource="{Binding ElementName=HeaderGrid, Path=ItemsSource, Mode=OneWay}"
Loaded="DataGrid_Loaded" HeadersVisibility="Row"
Margin="50 0 0 0">
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}"
Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid>
</StackPanel>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
2.次に、問題は、すべてのDataGridを単一のグリッドであるかのように動作させる方法です。これは、GridクラスのSharedSizeGroupの動作を模倣するというクラスでサブクラス化することで処理しましたDataGridTextColumn
(この場合はテキストのみですが、他の列タイプも機能するはずです) 。DataGridSharedSizeTextColumn
グループ名を持つ文字列依存関係プロパティがあり、同じグループ内のすべての列を追跡します。1つの列で変更があった場合Width.DesiredValue
、他のすべての列のMinWidthを更新し、を使用して強制的に更新しDataGridOwner.UpdateLayout()
ます。このクラスは列の並べ替えもカバーしており、DisplayIndexが変更されるたびにグループ全体の更新を行います。このメソッドは、セッターがあれば、他の列プロパティでも機能すると思います。
選択やコピーなどで解決するのは他にも厄介なことがありました。しかし、MouseEnteredイベントとMouseLeaveイベントを使用したり、カスタムのコピーコマンドを使用したりすると、非常に簡単に処理できることがわかりました。