CollectionViewSource分组,得到sum(Quantity)
CollectionViewSource grouping, get sum(Quantity)
我有一个 CollectionViewSource
其源是一个 ObservableCollection。
在 List
或 ObservableCollection
上,我可以使用 linq 对我的对象进行分组,并对它们的数量求和,但是如何在 CollectionViewSource 上进行(如果可能的话) ,我看不到任何关于它的文档。
目前我只能使用 :
管理分组
ProductsView.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
但我看不到有关如何显示总和或maximum/minimum字段值的信息?
编辑:
具体来说,我想做同样的事情:
liste_ass = liste_ass.GroupBy(l => l.Name)
.Select(cl => new Assemblage
{
Quantite = cl.Sum(c => c.Quantite),
ID = 0,
IdAffaire = cl.First().IdAffaire,
Name = cl.First().Name,
Priorite = 0,
Dessin = cl.First().Dessin,
Groupe = cl.First().Groupe,
Priorite = cl.Max(c=>c.Priorite),
ListeIdOperations = cl.First().ListeIdOperations,
}).ToList();
这就是我在 linq 中会做的事情。
但是阅读有关 ICollectionView 的信息,似乎无法在 ICollectionView 上执行此操作,因为它是一个视图,无法对其进行任何操作。
您可以访问每个 CollectionViewGroup
,其中包含所有组的信息,包括 ItemCount
到 CollectionView.Groups
属性。如果您想创建一个自定义组 header 并在 UI 上显示它,这里有一个示例:
<ListBox ItemsSource="{Binding your view}">
<ListBox.Resources>
<local:ToAssemblageConverter x:Key="toAssemblageConverter"/>
</ListBox.Resources>
<ListBox.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal"
DataContext="{Binding Items, Converter={StaticResource ResourceKey=toAssemblageConverter}}">
<TextBlock Margin="5 0" Text="{Binding Quantite}"/>
<TextBlock Margin="5 0" Text="{Binding Id}"/>
...
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
public class ToAssemblageConverter : IValueConverter
{
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var cl = (IEnumerable)value;
return new Assemblage() {
Quantite = cl.Sum(c => c.Quantite),
ID = 0,
IdAffaire = cl.First().IdAffaire,
Name = cl.First().Name,
Priorite = 0,
Dessin = cl.First().Dessin,
Groupe = cl.First().Groupe,
Priorite = cl.Max(c=>c.Priorite),
ListeIdOperations = cl.First().ListeIdOperations,
}
}
}
使用 DynamicData 你可以:
var sourceList = new SourceList<YourType>(); // use this instead of ObservableCollection
sourceList.Connect()
.AutoRefres(x => x.Quantite) // refresh when this property changes
.ToCollection()
.Select(col =>
col
.GroupBy(l => l.Name)
.Select(cl => new Assemblage
{
Quantite = cl.Sum(c => c.Quantite),
ID = 0,
IdAffaire = cl.First().IdAffaire,
Name = cl.First().Name,
Priorite = 0,
Dessin = cl.First().Dessin,
Groupe = cl.First().Groupe,
Priorite = cl.Max(c=>c.Priorite),
ListeIdOperations = cl.First().ListeIdOperations,
}).ToList()
)
.Subscribe(col => PublicPropertyWithChangeNotification = col);
当您从源列表中添加或删除项目时,它会自动更新结果,也会在 item.Quantite
更改时(如果它实现 INPC)
我有一个 CollectionViewSource
其源是一个 ObservableCollection。
在 List
或 ObservableCollection
上,我可以使用 linq 对我的对象进行分组,并对它们的数量求和,但是如何在 CollectionViewSource 上进行(如果可能的话) ,我看不到任何关于它的文档。
目前我只能使用 :
管理分组ProductsView.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
但我看不到有关如何显示总和或maximum/minimum字段值的信息?
编辑:
具体来说,我想做同样的事情:
liste_ass = liste_ass.GroupBy(l => l.Name)
.Select(cl => new Assemblage
{
Quantite = cl.Sum(c => c.Quantite),
ID = 0,
IdAffaire = cl.First().IdAffaire,
Name = cl.First().Name,
Priorite = 0,
Dessin = cl.First().Dessin,
Groupe = cl.First().Groupe,
Priorite = cl.Max(c=>c.Priorite),
ListeIdOperations = cl.First().ListeIdOperations,
}).ToList();
这就是我在 linq 中会做的事情。 但是阅读有关 ICollectionView 的信息,似乎无法在 ICollectionView 上执行此操作,因为它是一个视图,无法对其进行任何操作。
您可以访问每个 CollectionViewGroup
,其中包含所有组的信息,包括 ItemCount
到 CollectionView.Groups
属性。如果您想创建一个自定义组 header 并在 UI 上显示它,这里有一个示例:
<ListBox ItemsSource="{Binding your view}">
<ListBox.Resources>
<local:ToAssemblageConverter x:Key="toAssemblageConverter"/>
</ListBox.Resources>
<ListBox.GroupStyle>
<GroupStyle HidesIfEmpty="True">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal"
DataContext="{Binding Items, Converter={StaticResource ResourceKey=toAssemblageConverter}}">
<TextBlock Margin="5 0" Text="{Binding Quantite}"/>
<TextBlock Margin="5 0" Text="{Binding Id}"/>
...
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
public class ToAssemblageConverter : IValueConverter
{
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var cl = (IEnumerable)value;
return new Assemblage() {
Quantite = cl.Sum(c => c.Quantite),
ID = 0,
IdAffaire = cl.First().IdAffaire,
Name = cl.First().Name,
Priorite = 0,
Dessin = cl.First().Dessin,
Groupe = cl.First().Groupe,
Priorite = cl.Max(c=>c.Priorite),
ListeIdOperations = cl.First().ListeIdOperations,
}
}
}
使用 DynamicData 你可以:
var sourceList = new SourceList<YourType>(); // use this instead of ObservableCollection
sourceList.Connect()
.AutoRefres(x => x.Quantite) // refresh when this property changes
.ToCollection()
.Select(col =>
col
.GroupBy(l => l.Name)
.Select(cl => new Assemblage
{
Quantite = cl.Sum(c => c.Quantite),
ID = 0,
IdAffaire = cl.First().IdAffaire,
Name = cl.First().Name,
Priorite = 0,
Dessin = cl.First().Dessin,
Groupe = cl.First().Groupe,
Priorite = cl.Max(c=>c.Priorite),
ListeIdOperations = cl.First().ListeIdOperations,
}).ToList()
)
.Subscribe(col => PublicPropertyWithChangeNotification = col);
当您从源列表中添加或删除项目时,它会自动更新结果,也会在 item.Quantite
更改时(如果它实现 INPC)