WPF Группировка DataGrid, вложенных во вкладки с привязкой к данным - PullRequest
0 голосов
/ 26 октября 2010

Мне нужно применить группировку к строкам в 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

Итак, я чувствую себя потерянным. Любые предложения приветствуются.

Спасибо

1 Ответ

1 голос
/ 26 октября 2010

Итак, я нашел возможный ответ. Я открыт для интерпретации других людей. Это хорошее решение?

Применяя сообщение SO о том, какая часть шаблона MVVM отвечает за группировку DataGrid , я отправился на поиски решения для создания группировки во ViewModel. Я нашел простой пример на WpfTutorial.com

В моем InvoicePageViewModel я создал новое свойство, которое создает ListViewCollection из моего List. ListViewCollection позволяет мне добавить собственное описание GroupDescription следующим образом:

    public ListCollectionView GroupedInvoiceLines
    {
        get
        {
            ListCollectionView groupedLines = new ListCollectionView(InvoiceLines); // TODO should this be cached?

            groupedLines.GroupDescriptions.Add(new PropertyGroupDescription("DepartmentBillingCode"));

            return groupedLines;
        }
    }

Тогда было тривиально изменить привязку данных в DataGrid с InvoiceLines на GroupedInvoiceLines.

Комментарии? Вопросы?

...