博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
背水一战 Windows 10 (51) - 控件(集合类): ItemsControl - 项模板选择器, 数据分组...
阅读量:6251 次
发布时间:2019-06-22

本文共 6286 字,大约阅读时间需要 20 分钟。

原文:

背水一战 Windows 10 (51) - 控件(集合类): ItemsControl - 项模板选择器, 数据分组

作者:
介绍
背水一战 Windows 10 之 控件(集合类 - ItemsControl)

  • 项模板选择器
  • 数据分组

示例
1、ItemsControl 的项模板选择器
Controls/CollectionControl/ItemsControlDemo/ItemsControlDemo3.xaml

Controls/CollectionControl/ItemsControlDemo/ItemsControlDemo3.xaml.cs

/* * ItemsControl - 集合控件(继承自 Control, 请参见 /Controls/BaseControl/ControlDemo/) *  *  * 本例用于演示 ItemsControl 如何通过 item 的不同而使用不同的数据模板 */using System.Collections.ObjectModel;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows10.Common;namespace Windows10.Controls.CollectionControl.ItemsControlDemo{    public sealed partial class ItemsControlDemo3 : Page    {        public ObservableCollection
Employees { get; set; } = TestData.GetEmployees(100); public ItemsControlDemo3() { this.InitializeComponent(); } } // 自定义 DataTemplateSelector(数据模板选择器) // 可以实现在 runtime 时,根据 item 的不同选择不同的数据模板 public class MyDataTemplateSelector : DataTemplateSelector { // 数据模板 1(配置在 xaml 端) public DataTemplate DataTemplate1 { get; set; } // 数据模板 2(配置在 xaml 端) public DataTemplate DataTemplate2 { get; set; } // 根据 item 的数据的不同,指定的不同的模板 protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { var employee = item as Employee; if (employee == null || employee.IsMale) return DataTemplate1; // 男员工用数据模板 1 return DataTemplate2; // 女员工用数据模板 2 // 如果想直接返回指定的资源也是可以的(但是不灵活),类似:return (DataTemplate)Application.Current.Resources["DataTemplateMale"]; } }}

2、ItemsControl 的数据分组
Controls/CollectionControl/ItemsControlDemo/ItemsControlDemo4.xaml

Controls/CollectionControl/ItemsControlDemo/ItemsControlDemo4.xaml.cs

/* * ItemsControl - 集合控件(继承自 Control, 请参见 /Controls/BaseControl/ControlDemo/) *     IsGrouping - 当前 ItemsControl 显示的是否是分组数据(只读) *     DependencyObject GroupHeaderContainerFromItemContainer(DependencyObject itemContainer) - 获取指定 ItemContainer 的 HeaderContainer *      *      * 本例用于演示如何通过 ItemsControl 显示分组数据 *  * 注:本例是用 ListView 来演示数据分组的,用 GridView 做数据分组的示例请参见 /Index.xaml */using System;using System.Collections.Generic;using System.Linq;using System.Xml.Linq;using Windows.UI.Popups;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Data;using Windows10.Common;namespace Windows10.Controls.CollectionControl.ItemsControlDemo{    public sealed partial class ItemsControlDemo4 : Page    {        public CollectionViewSource MyData        {            get            {                XElement root = XElement.Load("SiteMap.xml");                var items = LoadData(root);                // 构造数据源                CollectionViewSource source = new CollectionViewSource();                source.IsSourceGrouped = true;                source.Source = items;                source.ItemsPath = new PropertyPath("Items");                return source;            }        }        public ItemsControlDemo4()        {            this.InitializeComponent();            this.Loaded += ItemsControlDemo4_Loaded;        }        private void ItemsControlDemo4_Loaded(object sender, RoutedEventArgs e)        {            lblMsg.Text = "IsGrouping: " + listView.IsGrouping.ToString();        }        private async void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            if (e.AddedItems.Count > 0 && listView.ContainerFromItem(e.AddedItems[0]) != null)            {                // 获取选中数据的 HeaderContainer                ListViewHeaderItem headerContainer = listView.GroupHeaderContainerFromItemContainer(listView.ContainerFromItem(e.AddedItems[0])) as ListViewHeaderItem;                NavigationModel headerNavigationModel = headerContainer.Content as NavigationModel;                await new MessageDialog($"header: {headerNavigationModel.Title}").ShowAsync();            }        }        // 解析 xml 数据        private List
LoadData(XElement root) { if (root == null) return null; var items = from n in root.Elements("node") select new NavigationModel { Title = (string)n.Attribute("title"), Url = (string)n.Attribute("url"), Items = LoadData(n) }; return items.ToList(); } } // 自定义 MyGroupStyleSelector(GroupStyle 选择器) // 可以实现在 runtime 时,根据 group 的不同选择不同的 GroupStyle public class MyGroupStyleSelector : GroupStyleSelector { static bool temp = false; // GroupStyle 1(配置在 xaml 端) public GroupStyle GroupStyle1 { get; set; } // GroupStyle 2(配置在 xaml 端) public GroupStyle GroupStyle2 { get; set; } protected override GroupStyle SelectGroupStyleCore(object group, uint level) { // 我这里测试,group 要么是 null 要么是 DependencyObject,level 总是 0 // 利用这个变量,来演示如何让不同的 group 使用不同的 GroupStyle temp ^= true; if (temp) return GroupStyle1; return GroupStyle2; // 如果想直接返回指定的资源也是可以的(但是不灵活),类似:return (GroupStyle)Application.Current.Resources["GroupStyle1"]; } }}

OK

转载地址:http://sofsa.baihongyu.com/

你可能感兴趣的文章
iframe刷新父页面
查看>>
KL46 custom board SWD reset is never asserted - SWS Waveform
查看>>
如何提高团队管理能力1
查看>>
Redmine中使用SVN进行版本管理经验总结
查看>>
【OC语法要闻速览】一、方法调用
查看>>
Oracle 重建索引脚本
查看>>
先锋军Android注射技术《三》
查看>>
使用光标
查看>>
find命令之exec
查看>>
CMake交叉编译配置
查看>>
Modular Inverse(模逆元,扩展欧几里德)
查看>>
高性能WEB开发之Web性能测试工具推荐
查看>>
找出两个文本文件的不同的行
查看>>
WPF笔记(1.2 Navigation导航)——Hello,WPF!
查看>>
练习PYTHON之GEVENT
查看>>
Web持久化存储Web SQL、Local Storage、Cookies(常用)
查看>>
node js 常用模块
查看>>
Libsvm和Liblinear的使用经验谈
查看>>
php生成curl命令行
查看>>
PHP中的数据库四、mongodb
查看>>