【问题标题】:Calculating Datagrid Group totals for a column and displaying them in Group Header计算列的 Datagrid 组总计并在组标题中显示它们
【发布时间】:2017-01-13 06:01:04
【问题描述】:

有很多 Datagrid 分组教程和问题,但我似乎根本无法让我的转换器计算我的项目总数。

情况是我有一个数据网格,它显示具有时间列的项目,这是完成任务的小时数,项目按任务完成的日期分组 - 见下文

所以要显示的总数是 1/8/16 组标题中的 7.5

我相信我需要使用 Linq 来查询 ObservableCollection,使用 group 属性作为过滤器,但我很难知道该做什么以及如何做。传递给转换器的集合中的项目似乎只有 Group Items 而不是下面的项目,就像属于该组的项目不在传递的集合中一样。

任何指针表示赞赏,如果我错过了任何所需的代码,我会清楚地添加它我不太理解这一点 - 提前致谢

这是我的转换器代码

 public class GroupTotalsToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is ReadOnlyObservableCollection<Object>)
        {
            var items = (ReadOnlyObservableCollection<Object>)value;
            Decimal total = 0;
            foreach (GroupItem gi in items)
            {
                //sometype of query to add up timespent

            }
            return total.ToString();
        }
        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

}

我的 Datagrid xmal 是

<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="271" ItemsSource="{Binding}" 
                          Name="enteredticketsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="435" 
                           Background="Black" RowBackground="Black" 
                      AlternatingRowBackground="DarkBlue"
                          MouseDoubleClick="enteredticketsDataGrid_MouseDoubleClick" Cursor="Arrow" 
                          IsReadOnly="True" ToolTip="Select the Date From and To and Refresh the grid. Dounle click on a return ticket to open the Edit screen for that ticket.">
                    <DataGrid.Columns>
                        <DataGridTextColumn x:Name="ticketDateColumn" Binding="{Binding Path=TicketDate, StringFormat=\{0:dd/MM/yy\} }" Header="Date" Width="Auto" />
                        <DataGridTextColumn x:Name="statusColumn" Binding="{Binding Path=status}" Header="status" Width="SizeToHeader" />
                        <DataGridTextColumn x:Name="numberColumn" Binding="{Binding Path=number}" Header="number" Width="Auto" />
                        <DataGridTextColumn x:Name="timespentColumn1" Binding="{Binding Path=timespent}" Header="Time" Width="SizeToHeader" />
                        <DataGridTextColumn x:Name="subjectColumn" Binding="{Binding Path=subject}" Header="Subject" Width="Auto" />


                    </DataGrid.Columns>
                    <DataGrid.GroupStyle>
                        <!-- Style for groups at top level. -->
                        <GroupStyle>
                            <GroupStyle.ContainerStyle>
                                <Style TargetType="{x:Type GroupItem}">
                                    <Setter Property="Margin" Value="0,0,0,5"/>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                                <Expander IsExpanded="False" Background="#FF112255" BorderBrush="#FF002255" Foreground="#FFEEEEEE" BorderThickness="1,1,1,5">
                                                    <Expander.Header>
                                                        <DockPanel>
                                                            <TextBlock FontWeight="Bold" Text="{Binding Path=Name, Converter={StaticResource StringToDateTimeConverter }}" Margin="5,0,0,0" Width="100"/>
                                                            <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}"/>
                                                            <!--<TextBlock FontWeight="Bold" Text="Test"/>-->
                                                            <TextBlock Text="{Binding  Path=Text, Converter={StaticResource GroupTotalsToStringConverter}}"></TextBlock>

                                                        </DockPanel>
                                                    </Expander.Header>
                                                    <Expander.Content>
                                                        <ItemsPresenter />
                                                    </Expander.Content>
                                                </Expander>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </GroupStyle.ContainerStyle>
                        </GroupStyle>
                    </DataGrid.GroupStyle>
                </DataGrid>

【问题讨论】:

    标签: c# wpf linq datagrid


    【解决方案1】:

    试试这个:

    xaml

    <Expander.Header>
         <DockPanel>
              <TextBlock FontWeight="Bold" Text="{Binding Path=Name, Converter={StaticResource StringToDateTimeConverter }}" Margin="5,0,0,0" Width="100"/>
              <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}"/>
    
              <TextBlock Text="{Binding  Path=Items, Converter={StaticResource GroupTotalsToStringConverter}, UpdateSourceTrigger=PropertyChanged}" />
    
         </DockPanel>
    </Expander.Header>
    

    这会将您的 ItemsCollection 作为值提供给转换器。特定的数据类型属于您的 ItemsSource,可以通过 ConverterCall 上的调试找到。

    【讨论】:

    • 谢谢现在在火车上,所以稍后再试......然后回来回答......所以我发送了什么集合,仅组标题项目之一?为什么更改会发送项目源或只是发送?
    • Path=Items 为您提供了该组的所有项目。然后你可以计算小时的总和(或任何你想要的)。我不确切知道值(在转换器中)是 ObservalbleCollection 还是 List 或其他一些 CollectionType...但你会弄清楚的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2018-12-08
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多