WPF对嵌套在数据绑定选项卡中的DataGrid进行分组

时间:2010-10-25 22:27:05

标签: wpf datagrid binding grouping

我需要对DataGrid中嵌套在TabControl中的行应用分组。 DataGridTabControl都是数据绑定。最外层控件绑定到ViewModel,该ViewModel公开绑定到TabControl的页面集合。每个页面都显示绑定到Grid的行集合。

我尝试遵循this one from SOthis one from C-SharpCorner等模式。我没有和这些结婚,所以如果有更好的模式(as this post seems to indicate),我愿意朝另一个方向前进。

目前,我不知道在哪里注入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

上看不到PropertyGroupDescriptionDataGrid.ItemSource

所以,我现在感到迷茫。 任何建议都表示赞赏。

由于

1 个答案:

答案 0 :(得分:1)

所以我找到了一个可能的答案。我对其他人的解释持开放态度。这是一个很好的解决方案吗?

应用SO post regarding what part of MVVM pattern is resonsible for grouping of DataGrid,我开始寻找解决方案以在ViewModel中生成分组。我在WpfTutorial.com

上找到了一个简单的例子

在我的InvoicePageViewModel中,我创建了一个新属性,用于从List中创建ListViewCollection。 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是微不足道的。

评论?有问题吗?