C# CollectionViewSource分组,获取总和(数量)
我有一个C# CollectionViewSource分组,获取总和(数量),c#,wpf,collectionviewsource,C#,Wpf,Collectionviewsource,我有一个CollectionViewSource,它的源是一个可观察的集合 在列表或ObservableCollection上,我可以使用linq对我的对象进行分组,并对它们的数量进行求和,但是如何在CollectionViewSource上实现这一点(如果可能的话),我看不到任何关于它的文档 目前,我只能使用以下方式管理分组: ProductsView.GroupDescriptions.Add(new PropertyGroupDescription("Group")); 但我看不到关于如
CollectionViewSource
,它的源是一个可观察的集合
在列表
或ObservableCollection
上,我可以使用linq对我的对象进行分组,并对它们的数量进行求和,但是如何在CollectionViewSource上实现这一点(如果可能的话),我看不到任何关于它的文档
目前,我只能使用以下方式管理分组:
ProductsView.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
但我看不到关于如何显示字段的和或最大/最小值的信息
编辑:
具体地说,我想做类似的事情:
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();
这就是我在林克要做的。
但是在阅读有关ICollectionView的内容时,似乎不可能在ICollectionView上执行此操作,因为它是一个视图,并且无法对其执行任何操作。您可以访问每个
CollectionViewGroup
,其中包含组的所有信息,包括ItemCount
到CollectionView.Groups
属性。如果要创建自定义组标题并将其显示在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,
}
}
}
...
公共类ToAssemblageConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
var cl=(IEnumerable)值;
返回新集合(){
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),
listedOperations=cl.First().listedOperations,
}
}
}
使用您可以执行以下操作:
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);
var sourceList=new sourceList();//使用此选项而不是ObservableCollection
sourceList.Connect()
.AutoRefres(x=>x.Quantite)//此属性更改时刷新
.ToCollection()
.选择(列=>
上校
.GroupBy(l=>l.Name)
.选择(cl=>新装配
{
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),
listedOperations=cl.First().listedOperations,
})托利斯先生()
)
.Subscribe(col=>PublicPropertyWithChangeNotification=col);
当您从源列表中添加或删除项目时,以及当
item.Quantite
更改时(如果它实现了INPC)我不需要itemcount,假设我的项目有一个字段“Quantity”,我想得到字段Quantity中的数量之和。例如,如果我有一个字段“MaxPrice”,我想得到“MaxPrice”的最大值。@Siegfried.V很抱歉误解,CollectionViewGroup
也有Items
属性包含属于该组的所有数据项,因此您可以使用该属性执行任何操作Converter在数据绑定中扮演重要角色。迟早你会需要它的。我相信越早越好^^数据转换是wpf数据绑定过程的一部分。MS定义用于简单数据绑定的IValueConverter
。如果将IValueConverter
应用于绑定为转换器,当数据绑定引擎注意到源已更新时,它将调用转换器的Convert
方法,并提供源值、目标类型、ConverterParameter
(如果您指定了它)、设置为绑定目标功率的区域性作为参数。在大多数情况下,我们只需要关心value和param,并根据它们返回值。Bing引擎将使用返回值来更新绑定目标。我认为这篇msdn文章将帮助您更好地理解数据绑定。本周第二次您向我介绍这一点时,我将去看看,我希望也有关于这方面的好文档:)文档有点糟糕,您应该在之前了解一些Rx。好的开始是,哦,还有一个很好的UI框架,可以自然地与DynamicData一起工作,因为它们都基于RxWell,我想我会选择第一个选项,我不知道Rx是什么,我在2,3年前开始使用C#2,3年前开始使用MVVM,所以我还是一个新手。。。