集团统计
问题描述:
我要让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
)而不是“测试”?
答
您将需要一个转换器将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"/>
有在给定的代码一些错误('ConvertBack',铸造- ,'转换.ToString',也许更多 - 我简化了对'switch/case'的反射,所以没有尝试运行一个完整的示例),但给出了如何实现这一点的想法。谢谢。剩下的唯一问题是如果'Items'可以改变怎么办?有一种简单的方法可以在组项目更改时刷新统计信息*?目前看起来只有一次转换价值 - 创建群组时。 'CollectionView.Refresh()'的作品,但它是残酷的方式,我必须处理编辑等。 –
Sinatr
2014-11-03 13:19:07
因为我第一次使用转换器(!),我发现[这个提示](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
@Sinatr是的,至少有2种逃避方式,我也知道第二种方式。 – 2014-11-03 13:45:54