none
CollectionViewSource Group Анонимные... RRS feed

  • Вопрос

  • WPF C#

    Добрый день. Подскажите по группировке коллекции или CollectionViewSource коллекции.

                   var obsGroup = obsFinance.GroupBy(c => c.DataPeriod.Year).Select(s => new
                        {
                            // Группировка по дате 
                            NameYear = s.Key,   // Год 2016
                            MounthGr = s.GroupBy(st => st.DataPeriod.Month).Select(st => new
                            {
    
                                NameMounth = st.Key, // Февраль
                                Kredit = st.Sum(t => t.KreditData),
                                Rashod = st.Sum(t => t.OutComing),                        
                              
                                Profildata = st.Select(dt => dt)
                            })
                        });
    
     obsFinance = new ObservableCollection<FinanceCC>();
                        int _number = 1;
                        foreach (var itemYear in obsGroup)
                        {
                            foreach (var itemMounth in itemYear.MounthGr)
                            {
                                FinanceCC _aa = new FinanceCC();
                                _aa.DataPeriod = new DateTime((int)itemYear.NameYear, (int)itemMounth.NameMounth, 1);
    
                                _aa.KreditData = itemMounth.Kredit;
                                _aa.OutComing = itemMounth.Rashod;                      
    
                                obsFinance.Add(_aa);
                                _number++;
                            }
                        }
                        LSTVSummaryTable.ItemsSource = null;
                        LSTVSummaryTable.ItemsSource = obsFinance;

    Плохой код? Возможно. Почему он такой. Потому что поля коллекции привязаны к DataTemplate. Знаний на более качественный код не хватает. Поэтому и задаю вопрос. :)

    А вопрос вот в чём. Код что выше группирует всё помесячно.

    Но мне необходимо сделать привязку без группировки. Т.е. отображать те же строки только без группировки. Если в месяце было 200 строчек то все 200 и отобразить а не одну сгруппированную.

    Решил взяться за CollectionViewSource и сделать их 2 штуки. Одна сгруппированная, а вторая несгруппированная.

    Но такая штука

                    var collectionVwSrc = new CollectionViewSource();
                        collectionVwSrc.Source = obsGroup;
                        collectionVwSrc.GroupDescriptions.Add(new PropertyGroupDescription("Key"));
    
                 
                        LSTVSummaryTable.ItemsSource = collectionVwSrc.View.Groups;

    всё делает хорошо, но поля в Контроле не соответсвуют анонимным полям в сгруппированной obsGroup. Соответственно привязка ничего не отображает, хотя строчки заносятся.

    Поменять поля в контроле на анонимные? А будет привязка к анонимным полям отображать их?

    Но даже если будет тоже не могу. Данный контрол имеет ViewModel используемый в других местах. Там привязка идёт к нормальным, не анонимным полям.

    Я вначале подумал просто создать другой метод и в нём осуществлять привязку без группировки, но опять же это не работает. Коллекция например после группировки то ли меняется структура её какая-то, но новая строка в сгруппированную коллекцию, не добавляется. Может и добавляется, но не отображается.

    В общем вопрос. Как группировать одну CollectionViewSource с новой группой и анонимными полями чтобы потом это могло отобразиться в ListView. Т.к. в ListView название полей не анонимные. И анонимными я их сделать не могу, даже если к ним возможна привязка.

    14 ноября 2016 г. 7:12

Ответы

  • У вас в группированном и разгруппированном состоянии разные типы данных. Я бы сделал два DataTemplate которые бы использовал в зависимости от типа элемента коллекции. Т.е. у вас в программе две коллекции, в зависимости от того, что вам нужно, вы подсовываете в ItemsSource или одну, или вторую. На у WPF уже сам определяет какой DataTemplate показывать. Возможно придется сделать неанонимный тип для сгруппированной коллекции.
    • Помечено в качестве ответа DevingAs 14 ноября 2016 г. 11:23
    14 ноября 2016 г. 10:43
    Отвечающий

Все ответы

  • Добрый день.

    Ничего не понял. Вы уже имеете сгрупированные данные в переменной obsGroup. Если эта коллекция у вас является источником данных, то дополнительных группировок по Key уже не нужно, особенно с учетом того, что у элементов этой коллекции нет свойства Key.

    14 ноября 2016 г. 8:35
    Отвечающий
  • Есть коллекция obsFinance. Там Поле DataPeriod и ещё несколько полей.

    Мне необходимо два варианта отображения в ListView.

    1) просто все строки какие есть в коллекции

    2) Сгруппированные по месяцам

    2 вариант мной реализован. Я группирую коллекцию obsFinance в переменную obsGroup и потом снова создаю новый экземпляр коллекции obsFinance и туда переписываю данные из obsGroup. И уже новый экземпляр коллекции привязываю к ListView.ItemsSource. Таким образом Менять поля на анонимные в DataTemplate не нужно.

    Но если вдруг мне сейчас необходимо показать в ListView всю коллекцию без группировки, т.е. в оригинале, то отобразить не могу, т.к. эта коллекция obsFinance уже сгруппирована и обратно её разгруппировать что-ли?

    Поэтому решил саму коллекцию не трогать, не группировать и ничего с ней не делать, только добавлять или удалять данные из неё. Но тогда как отображать данные в ListView в сгруппированном виде или не в сгруппированном. Можно создать на основе obsFinance две CollectionViewSource, но как их группировать, а главное как сделать чтобы после группировки одной их двух CollectionViewSource в DataTemplate отображались данные либо сгруппированные либо несгруппированные. (В одном представлении данные будут называться как поля в коллекции, в другом представлении имена будут анонимные и не совпадать с именами в dataTemplate) Менять селектором шаблон?

    :)


    • Изменено DevingAs 14 ноября 2016 г. 9:31
    14 ноября 2016 г. 9:28
  • Судя по всему это наверное тут

    <ListView.GroupStyle>

    14 ноября 2016 г. 9:46
  • У вас в группированном и разгруппированном состоянии разные типы данных. Я бы сделал два DataTemplate которые бы использовал в зависимости от типа элемента коллекции. Т.е. у вас в программе две коллекции, в зависимости от того, что вам нужно, вы подсовываете в ItemsSource или одну, или вторую. На у WPF уже сам определяет какой DataTemplate показывать. Возможно придется сделать неанонимный тип для сгруппированной коллекции.
    • Помечено в качестве ответа DevingAs 14 ноября 2016 г. 11:23
    14 ноября 2016 г. 10:43
    Отвечающий