как структурировать данные для gridview, которые сгруппированы

Как мне сделать свою коллекцию для сгруппированной коллекции в gridview?

Когда я создаю группы List<List<MyObject>>, я получаю сгруппированные данные с хорошим количеством групп и элементов в каждой группе, но у меня нет названий групп. Итак, я создал объект MyGroupedObject с двумя полями.

public String Key;
public List<MyObject> items;

поэтому я сгруппировал это в объект. Но когда я передаю его в виде сетки (как показано ниже), у меня ничего нет. Нет элементов, нет групп, нет ничего

 <Page.Resources>
<!--
    Collection of grouped items displayed by this page, bound to a subset
    of the complete item list because items in groups cannot be virtualized
-->
<CollectionViewSource
    x:Name="groupedItemsViewSource"
    IsSourceGrouped="true"
    />

</Page.Resources>

чем в gridview, я просто привязываю эту коллекцию как ItemsSource

этот вопрос основан на: как создать gridview из словаря

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


person Fixus    schedule 27.08.2012    source источник


Ответы (2)


Вы видели пример группировки и семантического масштабирования? http://code.msdn.microsoft.com/windowsapps/groupedgridview-77c59e8e

Вы также можете посмотреть Как сгруппировать элементы в списке или сетке... http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh780627.aspx

Краткое объяснение... вы можете сделать это одним из двух способов...

List<Activity> Activities = new List<Activity>(); 
Activities.Add(new Activity() 
    { Name = "Activity 1", Complete = true, 
            DueDate = startDate.AddDays(4), Project = "Project 1" });
Activities.Add(new Activity() 
    { Name = "Activity 2", Complete = true, 
            DueDate = startDate.AddDays(5), Project = "Project 2" });

а затем следующее, чтобы получить данные в вашем CollectionViewSource

var result = from act in Activities 
             group act by act.Project into grp 
             orderby grp.Key select grp;
cvsActivities.Source = result;

Или вы можете построить иерархию, используя свойства объекта, подобные этому...

List<Project> Projects = new List<Project>();

Project newProject = new Project();
newProject.Name = "Project 1";
newProject.Activities.Add(new Activity() 
    { Name = "Activity 1", Complete = true, DueDate = startDate.AddDays(4) });
newProject.Activities.Add(new Activity() 
    { Name = "Activity 2", Complete = true, DueDate = startDate.AddDays(5) });
newProject.Activities.Add(new Activity() 
    { Name = "Activity 3", Complete = false, DueDate = startDate.AddDays(7) });
newProject = new Project();
newProject.Name = "Project 2";
newProject.Activities.Add(new Activity() 
    { Name = "Activity A", Complete = true, DueDate = startDate.AddDays(2) });
newProject.Activities.Add(new Activity() 
    { Name = "Activity B", Complete = false, DueDate = startDate.AddDays(3) });
cvsProjects.Source = Projects;

Вы не можете привязаться к простому списку и автоматически настроить группировку для вас.

person Jeff Brand    schedule 27.08.2012
comment
но пример проекта - это именно то, что я сделал. у вас есть объект Project с именем (мой ключ) и действиями (мои элементы). Затем я установил его для коллекции в качестве источника. это то, что я описал, и это не работает. Спасибо за ссылки, я их еще раз проверю - person Fixus; 27.08.2012
comment
Джефф, твои ссылки и объяснения были бесценны. Я нашел решение. Проблема заключалась в одной маленькой ошибке в моей модели данных, и я улучшил группировку. Теперь все работает отлично - person Fixus; 27.08.2012
comment
Если выше не ясно, ключ использует CollectionViewSource. Просто установить эту коллекцию коллекций как GridView.ItemsSource не получится. Вы должны установить GridView.ItemsSource = a CollectionViewSource, а CollectionViewSource должен указывать на коллекцию коллекций. Вам также, вероятно, придется установить CollectionViewSource.IsSourceGrouped = true. - person Jared Bienz - MSFT; 28.08.2012

Ваши данные должны быть такими же, как описано IList<MyGroupObject>, где MyGroupObject определен как таковой.

class MyGroupObject
{
    public String Key; // used for group title
    public IList<MyObject> Items;
}

Тогда ваш CollectionViewSource должен быть определен как таковой

<CollectionViewSource
    x:Name="groupedItemsViewSource"
    IsSourceGrouped="true"
    Source="{Binding GroupItems}" <!-- Property in the backing ViewModel -->
    ItemsPath="Items" <!-- Property on the MyGroupObject class -->
/>
person Shawn Kendrot    schedule 27.08.2012
comment
единственная разница в вашем коде и в том, что я сделал, это то, что я использую в своем файле cs groupedItemsViewSrouce.Source = groups, где группы - это список сгруппированных объектов. Это не работает :/ - person Fixus; 27.08.2012
comment
Я также включил ItemsPath, необходимый для просмотра элементов в группе. - person Shawn Kendrot; 27.08.2012
comment
Да, я вижу, я уже пробовал это. Но я думаю, что сейчас я на правильном пути. Я начал все с нуля, используя ваши, и Jeffs advices and Im начал что-то делать - person Fixus; 27.08.2012