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,所以我还是一个新手。。。