代码之家  ›  专栏  ›  技术社区  ›  Siegfried.V

CollectionViewSource分组,获取和(数量)

  •  0
  • Siegfried.V  · 技术社区  · 6 年前

    我有一个 CollectionViewSource 其来源是一个可观察的集合。

    在一 List 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上执行此操作,因为它是一个视图,因此无法对其执行任何操作。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alex.Wei    6 年前

    您可以访问 CollectionViewGroup 其中包含了Gourp的所有信息,包括 ItemCount 通过 CollectionView.Groups 财产。如果要创建自定义组头并在用户界面上显示,下面是一个示例:

        <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,
            }
        }
    }
    
        2
  •  1
  •   Krzysztof Skowronek    6 年前

    使用 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)