CollectionViewSource группировки, получить сумму (количество) - PullRequest
0 голосов
/ 25 января 2019

У меня есть CollectionViewSource, источником которого является ObservableCollection.

На 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();

Это то, что я бы сделал в linq. Но, читая о ICollectionView, кажется, что это невозможно сделать в ICollectionView, так как это представление, и с ними невозможно выполнить никаких операций.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Используя 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)

0 голосов
/ 25 января 2019

Вы можете получить доступ к каждому CollectionViewGroup, который содержит всю информацию о гурпе, включая свойство 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,
        }
    }
}
...