Мне нужно применить группировку к строкам в DataGrid
, вложенном в TabControl
. И DataGrid
, и TabControl
привязаны к данным. Самый внешний элемент управления привязан к ViewModel, который предоставляет коллекцию страниц, привязанную к TabControl
. Каждая страница предоставляет коллекцию строк, которая связана с Grid
.
Я пытаюсь следовать шаблонам, таким как этот от SO и этот от C-SharpCorner . Я не женат на них, поэтому, если есть лучший шаблон (, как, кажется, этот пост указывает на ), я готов пойти в другом направлении.
Пока я не уверен, куда добавить определение PropertyGroupDescription
и связать его с моим желаемым PropertyName
. Я пытался сделать это как ресурс и напрямую как CollectionViewSource
на DataGrid
. Но ни один из них не дал разумных результатов.
Это то, что я имею до сих пор:
<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">
отрезал для ясности ...
<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>
Я думаю, мне нужно добавить что-то вроде:
<CollectionViewSource>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="DepartmentBillingCode" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
Если я добавлю CollectionViewSource
в качестве ресурса и изменим привязку DataGrid
, в сетке не будет строк.
Если я добавлю CollectionViewSource
к DataGrid
, я получу исключение: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
, вложенный в Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception.
Но я не вижу GroupDescription
или PropertyGroupDescription
на DataGrid.ItemSource
Итак, я чувствую себя потерянным.
Любые предложения приветствуются.
Спасибо