设为首页 收藏本站
查看: 1791|回复: 0

Win8中GridVIew千变万化——绑定分组数据

[复制链接]

尚未签到

发表于 2015-5-20 12:28:23 | 显示全部楼层 |阅读模式
  今天和大家探讨下GridView如何绑定分组数据的例子。
  要实现分组绑定数据主要两个步骤:
1、创建创建CollectionViewSource并且绑定(这里可以使用两种类型的数据作为数据源,一种使用Linq,另一种使用的时集合中包含集合数据);
2、设置GroupStyle的相关属性和样式。
  第一步:创建集合数据源



public sealed partial class Group : Page
{
CollectionViewSource cvsActivities;//, cvsProjects;
DateTime startDate;//一个界定时间
public Group()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
DateTime.TryParse("1/1/2014", out startDate);//初始化一个界定时间

cvsActivities = new CollectionViewSource();
InitActivities();
//cvsActivities.Source = InitActivities();
cvsActivities.IsSourceGrouped = true;
listView.ItemsSource = cvsActivities.View;
CollectionViewSource cvsProjects = new CollectionViewSource();
cvsProjects.Source = InitProjects();
cvsProjects.IsSourceGrouped = true;
cvsProjects.ItemsPath = new PropertyPath("Activities");//这里需要指定每组数据子项目的路径
gridView.ItemsSource = cvsProjects.View;
}
private void InitActivities()
{
List Activities = new List();
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 1"
});
Activities.Add(new Activity()
{
Name = "Activity 3",
Complete = false,
DueDate = startDate.AddDays(7),
Project = "Project 1"
});
Activities.Add(new Activity()
{
Name = "Activity 4",
Complete = false,
DueDate = startDate.AddDays(9),
Project = "Project 1"
});
Activities.Add(new Activity()
{
Name = "Activity 5",
Complete = false,
DueDate = startDate.AddDays(14),
Project = "Project 1"
});
Activities.Add(new Activity()
{
Name = "Activity A",
Complete = true,
DueDate = startDate.AddDays(2),
Project = "Project 2"
});
Activities.Add(new Activity()
{
Name = "Activity B",
Complete = false,
DueDate = startDate.AddDays(4),
Project = "Project 2"
});
Activities.Add(new Activity()
{
Name = "Activity C",
Complete = true,
DueDate = startDate.AddDays(5),
Project = "Project 2"
});
Activities.Add(new Activity()
{
Name = "Activity D",
Complete = false,
DueDate = startDate.AddDays(9),
Project = "Project 2"
});
Activities.Add(new Activity()
{
Name = "Activity E",
Complete = false,
DueDate = startDate.AddDays(18),
Project = "Project 2"
});
//自己创建分组 使用Linq查询的分组数据
var result = from act in Activities
group act by act.Project into grp
orderby grp.Key
select grp;
cvsActivities.Source = result;
//return result.ToList();//这个方法不能使用
        }
private List InitProjects()
{
List 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.Activities.Add(new Activity() { Name = "Activity 4", Complete = false, DueDate = startDate.AddDays(9) });
newProject.Activities.Add(new Activity() { Name = "Activity 5", Complete = false, DueDate = startDate.AddDays(14) });
Projects.Add(newProject);
//第二个Project
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) });
newProject.Activities.Add(new Activity() { Name = "Activity C", Complete = true, DueDate = startDate.AddDays(5) });
newProject.Activities.Add(new Activity() { Name = "Activity D", Complete = false, DueDate = startDate.AddDays(9) });
newProject.Activities.Add(new Activity() { Name = "Activity E", Complete = false, DueDate = startDate.AddDays(18) });
Projects.Add(newProject);
//第三个Project没有子项
newProject = new Project();
newProject.Name = "Project 3";
Projects.Add(newProject);
return Projects;
//这里每一个子项目都包含一个子项集合数据
//cvsProjects.Source = Projects;
//cvsProjects.ItemsPath = new PropertyPath("Activities");
        }
}
public  class Activity
{
public string Name { get; set; }
public DateTime DueDate { get; set; }
public bool Complete { get; set; }
public string Project { get; set; }
}
public  class Project
{
public Project()
{
Activities = new ObservableCollection();
}
public string Name { get; set; }
public ObservableCollection Activities { get; private set; }
}
public class ListGroupStyleSelector : GroupStyleSelector
{
protected override GroupStyle SelectGroupStyleCore(object group, uint level)
{
// Group g = new Group();
return (GroupStyle)App.Current.Resources["listViewGroupStyle"];//(GroupStyle)g.Resources["listViewGroupStyle"]; //(GroupStyle)App.Current.Resources["listViewGroupStyle"];
    }
}
}
  下面讲解下代码和我遇到的问题:
a、里面有两个类Activity和Project;Activity类主要包括一些基本属性,所以在InitActivities方法里面使用的时Linq查询返回的集合数据,Project类里面还包含一个集合数据;
在InitActivities方法中我本来想直接返回List,但是当我调用ToList方法的时候报错了;貌似在Win8中不能用还是什么,大家指点下;
b、在创建CollectionViewSource的时候主要注意问题的我们必须设置IsSourceGrouped为true、并且必须制定ItemsPath(Linq查询的可以不需要);在设置数据源的时候我们需要用的是View属性(例: listView.ItemsSource = cvsActivities.View)
  
第二步:设置GroupStyle






























































  在XAML页面我们需要设置:
  GridView.ItemTemplate:每一个组里子项目的样式,相当于没有分组前的每一个Item的模板
GridView.ItemsPanel:每个组的布局方式
GridView.GroupStyle:分组模版样式包括Head和Container
GroupStyle.HeaderTemplate:头模板
GroupStyle.ContainerStyle:每一组的样式
GroupStyle.Panel:每组里面每一个子项的布局方式
在这里遇到问题是:我将ListView的GroupStyleSelector写在当前页面通过当前页面实例去获取资源的时候会产生一个StackOverFlow异常,放在App.xaml页面就不会,请指点下;
运行结果
DSC0000.jpg
在运行结果上面为什么会出想默认就选择了第一项;难道是使用了CollectionViewSource的缘故吗?因为我没有设置默认选择,求指点。
详细代码大家可以参考MSDN

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-68904-1-1.html 上篇帖子: Win8+VS2012 配置OpenGL SuperBible5 环境 下篇帖子: Windows 8 系列(四):Win8 RSA加密相关问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表