【问题标题】:how to structure data fro gridview that is grouped如何从分组的gridview构造数据
【发布时间】:2013-02-22 23:14:09
【问题描述】:

我应该如何在 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

此问题基于:how to create gridview from dictionary

我在原来的问题中创造了新的原因,所以我想把它说清楚

【问题讨论】:

    标签: c# xaml windows-8 windows-runtime winrt-xaml


    【解决方案1】:

    您看过分组和语义缩放示例吗? 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;
    

    您无法绑定到简单列表并自动为您配置分组。

    【讨论】:

    • 但项目示例正是我所做的。您有一个带有名称(我的密钥)和活动(我的项目)的对象项目。比我将它设置为收集源。这就是我所描述的,但它不起作用。感谢您的链接,我会仔细检查它们
    • 杰夫你的链接和解释是无价的。我找到了解决方案。问题是我的数据模型中的一个小错误,我改进了分组。现在一切正常
    • 如果上面不清楚,关键是使用CollectionViewSource。只是将这个“集合集合”设置为 GridView.ItemsSource 是行不通的。您必须设置 GridView.ItemsSource = a CollectionViewSource 并且 CollectionViewSource 必须指向“集合集合”。您可能还必须设置 CollectionViewSource.IsSourceGrouped = true。
    【解决方案2】:

    您的数据应该与 IList&lt;MyGroupObject&gt; 中描述的一样,其中 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 -->
    />
    

    【讨论】:

    • 您的代码和我所做的是我在我的cs文件groupedItemsViewSrouce.Source = groups中使用的唯一区别,其中groups是分组对象的列表。它不起作用:/
    • 我还添加了ItemsPath,这是查看组中项目所必需的
    • 是的,我知道我已经尝试过了。但我认为我现在走在正确的道路上。我用你的从头开始一切,Jeffs advices and Im 开始取得进展
    猜你喜欢
    • 2016-08-30
    • 2023-03-30
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2015-12-12
    • 2014-02-01
    • 2022-01-07
    • 2017-08-27
    相关资源
    最近更新 更多