2017-01-11 15 views
0

Следующий запрос возвращает тип <IGrouping<string, ItemsCollection>>, который может быть привязан к GridView. Используется с CollectionViewSource, ключ (как имя группы) используется для отображения заголовка/заголовка группы, например, путем привязки к TextBlock в GroupStyle.HeaderTemplate для GridView.Можно ли изменить групповой ключ для <IGrouping <string, ItemsCollection >> таким образом, чтобы он был добавлен с информацией о количестве групп для привязки?

var query = from ItemObj in ItemsObjCollection 
orderby ItemObj.ItemName 
group ItemObj by ItemObj.GroupName into groups 
orderby groups.Key 
select groups; 

Все работает нормально, как и ожидалось, и проблем пока нет.

Моя следующая попытка (где я нахожусь в затруднении) для Ключа, который выводит имя группы, чтобы также обеспечить подсчет элемента группы, чтобы он был изменен, например, как «Название группы [счет]», где счет можно легко получить как groups.Count() в запросе. Предположим, что ItemsObjCollection представляет Фрукты, тогда заголовок должен быть похож на Яблоки [10], Бананы [7], Апельсины [12] и т. Д.

Можно ли сгруппировать ключ для отображения вывода (посредством привязки), чтобы он был добавлен с информацией о количестве групп, как описано? В принципе, я хотел бы Key = $"{groups.Key} [{groups.Count()}]", но не знаю, как в запросе. Пробовал по линии:

select new { Key = $"{groups.Key} [{groups.Count()}]", Items = groups };

но мой модифицированный ключ не появляется в связывании, так не уедешь. Я также обнаружил, что не просто создать экземпляр IGrouping (потому что это интерфейс) и надеется, что есть разумный способ сделать это в вышеприведенном запросе, и кто-то должен был это сделать уже.

+0

Вы комбинируете строку и целое число, поэтому попробуйте это: выберите new {Key = groups.Key + groups.Count(). ToString(), Items = groups}; – jdweng

+0

Это не так. Я просто использую последний синтаксис интерполяции строк C# 6.0, так что вы говорите и то, что я говорю, эквивалентны. См. $ "{Var} ...", который является строковым интерполятором. – user2921851

+0

Ваш запрос одобрен. Как привязка? –

ответ

1

Я решил это, но может и не быть аккуратным. В основном я создал эквивалент нового запроса, основанного на приведенном выше результате запроса, но с измененным ключом группировки. Для этого мне нужен новый класс для создания новых групп.

public class NewGrouping<TKey, TElement> : List<TElement>, IGrouping<TKey, TElement> 
{ 
    public TKey Key { get; set; } 
} 

Далее, новая группировка была сформирована перебор старой группировки - в процессе с ключом модифицированного дополнительной информацией, как Key = $"{grp.Key} [{grp.Count()}]".

List<IGrouping<string, ItemsObjCollection>> newQuery = new List<IGrouping<string, ItemsObjCollection>>(); 

foreach (var grp in query) 
{ 
    NewGrouping<string, ItemsObjCollection> newGroup = new NewGrouping<string, ItemsObjCollection>() { Key = $"{grp.Key} [{grp.Count()}]" }; 
    newGroup.AddRange(grp.ToList()); 

    newQuery.Add(newGroup); 
} 

Использование newQuery вместо query для связывания с GridView, и вуаля! Работает так, как ожидалось.

PS: Интересно, почему кто-то проголосовал за мой вопрос как менее полезный/исследованный. Это не тривиальный вопрос, и, возможно, этот человек не понял вопроса.

 Смежные вопросы

  • Нет связанных вопросов^_^