Group statistic

霸气de小男生 提交于 2019-12-24 14:28:22

问题


I want to make DataGrid with grouping like below

My question is how to do that "Average value" in group header?

Below is a huge xaml

    <DataGrid x:Name="dataGrid" Grid.Column="1" CanUserResizeRows="False" CanUserSortColumns="False" GridLinesVisibility="None" AutoGenerateColumns="False" ItemsSource="{Binding List}" HeadersVisibility="Column" Grid.IsSharedSizeScope="True">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding A}" Header="A"/>
            <DataGridTextColumn Binding="{Binding B}" Header="B"/>
            <DataGridTextColumn Binding="{Binding C}" Header="C"/>
            <DataGridTextColumn Binding="{Binding Group}" Header="Group"/>
        </DataGrid.Columns>
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="GroupItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="GroupItem">
                                    <Border BorderBrush="Gray" BorderThickness="0.5" CornerRadius="4" Margin="3">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                                                <GradientStop Color="#FFACACAC" Offset="0"/>
                                                <GradientStop Color="White" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <StackPanel>
                                            <Grid>
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition SharedSizeGroup="A"/>
                                                    <ColumnDefinition SharedSizeGroup="B"/>
                                                    <ColumnDefinition/>
                                                </Grid.ColumnDefinitions>
                                                <TextBlock Text="{Binding Name}" Margin="10,0,10,0"/>
                                                <TextBlock Grid.Column="1" Text="{Binding ItemCount}" Margin="10,0,0,0"/>
                                                <TextBlock Grid.Column="2" Text="test" Margin="10,0,0,0"/>
                                            </Grid>
                                            <Expander>
                                                <Border BorderBrush="Gray" BorderThickness="0.5" Margin="3">
                                                    <ItemsPresenter/>
                                                </Border>
                                            </Expander>
                                        </StackPanel>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
    </DataGrid>

Which produces this output

I can output group name (green arrow) and counter (red arrow).

How can I output average value for either column (let it be A) instead of "test"?


回答1:


You will need a converter to convert the Items property into the average. Something like this:

public class ItemsToAverageConverter : IValueConverter {
  public object Convert(object value, Type targetType, object parameter,
                                                       CultureInfo culture){
    var propName = Convert.ToString(parameter);
    var items = (IEnumerable<Item>) value;
    var prop = typeof(Item).GetProperty(propName);
    if(prop == null) return Binding.DoNothing;
    return items.Average(i => (double) prop.GetValue(i));
  }
  public object Convert(object value, Type targetType, object parameter,
                                                       CultureInfo culture){
    throw new NotImplementedException();
  }
}

I suppose the item type is Item. You use that converter in your XAML code, maybe you need some StringFormat to format the value representation.

Suppose you have this resource somewhere accessible:

<local:ItemsToAverageConverter x:Key="avgConverter"/>

The code should be changed like this:

<TextBlock Grid.Column="1" Text="{Binding Items,
                                  Converter={StaticResource avgConverter},
                                  ConverterParameter=A,
                                  StringFormat=f2}" Margin="10,0,0,0"/>


来源:https://stackoverflow.com/questions/26712051/group-statistic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!