如何按用户名对datagrid中的项目进行分组

时间:2017-10-26 12:02:37

标签: c# wpf xaml datagrid

我正在研究wpf应用程序,它正在使用数据库中的项填充datagrid。 那些项目代表咖啡店的用户以及他们赚了多少钱......这是一张图片:

enter image description here

  • 约翰
    现金$ 192,00

  • John Doe
    现金75,00美元 卡丁车75,00

现在我正在填充我的数据网格:

dtgCashAmount.ItemsSource = null;
dtgCashAmount.ItemsSource = BController.GetAllFinancialTransactionsByAllUsers(dateFrom, dateTo);

但是我试过这样的事情(按用户名实际分组项目) - 但是它没有工作:

首先我在我的XAML中添加了Window.Resources

<Window.Resources>
     <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
         <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <StackPanel>
                            <TextBlock Text="{Binding Name}"/>
                            <ItemsPresenter />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
         </Setter>
     </Style>

在此之后,我在datagrid

中添加了此内容
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
    <GroupStyle.Panel>
       <ItemsPanelTemplate>
          <DataGridRowsPresenter/>
        </ItemsPanelTemplate>
    </GroupStyle.Panel>
</GroupStyle>

在我的C#代码中,我尝试过这样的事情:

ListCollectionView collection = new ListCollectionView(DatabaseResults);
collection.GroupDescriptions.Add(new PropertyGroupDescription("Username")); 

基本上我说:好的组这些结果我是通过用户名从数据库获得的,以获得我在上面的问题中提供的结果(如下图所示)。 但不幸的是,我收到了以下错误:

  

在使用ItemsSource之前,项目集合必须为空。

即使我检查过我没有在其他地方设置我的数据网格源..

DataGrid XAML:

<DataGrid Grid.Row="1" IsReadOnly="True" Name="dtgCashAmount " EnableRowVirtualization ="True" EnableColumnVirtualization = "True" GridLinesVisibility="Horizontal"  AutoGenerateColumns="False" RowHeaderWidth="0" CanUserAddRows="False">
            <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <DataGridRowsPresenter/>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
            </GroupStyle>

            <DataGrid.CellStyle>
                <StaticResource ResourceKey="DataGridCentering"/>
            </DataGrid.CellStyle>

            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="Background" Value="#0091EA"/>
                    <Setter Property="Opacity" Value="1"/>
                    <Setter Property="Foreground" Value="White"/>
                    <Setter Property="HorizontalContentAlignment" Value="Center" />
                    <Setter Property="FontFamily" Value="Arial"/>
                    <Setter Property="Height" Value="40"/>
                </Style>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue"/>  
            </DataGrid.Resources>

            <DataGrid.Columns>
                <DataGridTextColumn x:Name="colPaymentType" Binding="{Binding PaymentType.Title }" Header="Payment type"  Foreground="Black"  FontSize="{x:Static local:Globals.dataGridfontSizeContent}" FontFamily="Verdana"  Width="10*"/>
                <DataGridTextColumn x:Name="colKorisnik" Binding="{Binding Username }" Header="Username"  Foreground="Black"  FontSize="{x:Static local:Globals.dataGridfontSizeContent}" FontFamily="Verdana"  Width="10*"/>
                <DataGridTextColumn x:Name="colPrice" Binding="{Binding TotalAmount}" Header="Total amount"  Foreground="Black"  FontSize="{x:Static local:Globals.dataGridfontSizeContent}" FontFamily="Verdana"  Width="10*"/>
            </DataGrid.Columns>
</DataGrid>

mm8 之后帮助我现在看起来像这样:

enter image description here

我在互联网上看到了一个更好的例子(对于用户来说测试它组织得很好):

enter image description here

mm8伙伴是否有可能实现这样的目标?

1 个答案:

答案 0 :(得分:1)

GroupStyle应在<DataGrid.GroupStyle>元素中定义:

<DataGrid.GroupStyle>
    <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <DataGridRowsPresenter/>
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
    </GroupStyle>
</DataGrid.GroupStyle>

...而不是<DataGrid>元素的直接子元素。