Je dois appliquer le regroupement aux lignes d'un DataGrid
imbriqué dans un TabControl
. Les deux DataGrid
et TabControl
sont databound. Le contrôle le plus externe est lié à un ViewModel qui expose une collection de pages liée au TabControl
. Chaque page expose une collection de lignes liées au Grid
. Je suis essayé de suivre des modèles comme this one from SO et this one from C-SharpCorner. Je ne suis pas marié à ceux-ci, donc s'il y a un meilleur modèle (as this post seems to indicate), je suis prêt à aller dans une autre direction.WPF Regroupement d'un DataGrid imbriqué dans les onglets de la base de données
Pour l'instant, je ne sais pas où injecter la définition du PropertyGroupDescription
et le lier à mon désiré PropertyName
. J'ai essayé de le faire comme une ressource et directement comme un CollectionViewSource
sur le DataGrid
. Mais aucun n'a produit de résultats raisonnables.
C'est ce que j'ai jusqu'à présent:
<UserControl x:Class="View.ViewInvoiceUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" >
<Grid Name="_grid" MinHeight="100">
Snipped pour plus de clarté ...
<TabControl
ItemsSource="{Binding Path=CurrentInvoice.InvoicePages}"
Grid.Column="0"
Grid.ColumnSpan="4"
Grid.Row="5"
HorizontalAlignment="Left"
Margin="0,4,0,0"
Name="_invoicePageTabControl"
VerticalAlignment="Top">
<TabControl.ItemContainerStyle />
<TabControl.ContentTemplate>
<DataTemplate>
<DataGrid
Name="_invoiceLineGrid"
AutoGenerateColumns="False"
CanUserSortColumns="True"
ColumnHeaderStyle="{StaticResource columnHeaderStyle}"
HorizontalAlignment="Left"
ItemsSource="{Binding InvoiceLines}"
IsReadOnly="True"
RowDetailsVisibilityMode="VisibleWhenSelected"
RowStyle="{StaticResource DataGridRowStyle}"
SelectionUnit="FullRow"
VerticalAlignment="Top"
Visibility="{Binding Path=InvoiceLineGridVisibility}"
Initialized="_invoiceLineGrid_Initialized">
<DataGrid.Columns>
<DataGridTextColumn Header="Line Number" MinWidth="50" Binding="{Binding InvoiceLineNumber}" />
<DataGridTextColumn Header="Description" MinWidth="50" Width="*" Binding="{Binding Description}" />
<DataGridTextColumn Header="Quantity" MinWidth="50" Binding="{Binding Quantity}" />
<DataGridTextColumn Header="Extended Cost" MinWidth="50" Width="*" Binding="{Binding ExtendedCost}" />
</DataGrid.Columns>
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander>
<Expander.Header>
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
</UserControl>
Je pense que je dois ajouter quelque chose comme:
<CollectionViewSource>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="DepartmentBillingCode" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
Si j'ajoute le CollectionViewSource
en tant que ressource et modifiez la liaison DataGrid
, il n'y a aucune ligne dans la grille. Si j'ajoute le CollectionViewSource
au DataGrid
, je reçois une exception: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
niché dans Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception.
Mais je ne vois pas GroupDescription
ou PropertyGroupDescription
sur DataGrid.ItemSource
Alors, je me sens perdu maintenant. Toutes les suggestions sont appréciées.
Merci
@ Георгий Ланец, merci pour l'édition. C'est agréable de voir de vieilles questions attirer un peu l'attention. –
Paul, votre bienvenue. J'aime apporter du code à la perfection. C'est pourquoi j'ai toujours pris des délais. –