2014-11-03 55 views
1

我要让DataGrid中包含 集团统计

我的问题是分组怎么做“平均价值”,在组头?

下面是一个巨大的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> 

其中产生这样的输出

我可以输出组名(绿色箭头)和计数器(红色箭头)。

如何输出任一列的平均值(让它为A)而不是“测试”?

回答

1

您将需要一个转换器将Items属性转换为平均值。这样的事情:

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(); 
    } 
} 

我想这个项目类型是Item。您在XAML代码中使用该转换器,也许您需要一些StringFormat来格式化值表示。

假设你有地方访问这个资源:

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

的代码应更改如下:

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

有在给定的代码一些错误('ConvertBack',铸造,'转换.ToString',也许更多 - 我简化了对'switch/case'的反射,所以没有尝试运行一个完整的示例),但给出了如何实现这一点的想法。谢谢。剩下的唯一问题是如果'Items'可以改变怎么办?有一种简单的方法可以在组项目更改时刷新统计信息*?目前看起来只有一次转换价值 - 创建群组时。 'CollectionView.Refresh()'的作品,但它是残酷的方式,我必须处理编辑等。 – Sinatr 2014-11-03 13:19:07

+0

因为我第一次使用转换器(!),我发现[这个提示](http://drwpf.com/博客/ 2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup /)非常有用(以减少xaml * noise *)。同样在'StringFormat = {} {0:f2}'你可以像这样'StringFormat = \ {0.00 \}''中转义括号,我相信它比这个'{}'修复更清晰。 – Sinatr 2014-11-03 13:26:43

+0

@Sinatr是的,至少有2种逃避方式,我也知道第二种方式。 – 2014-11-03 13:45:54