使用x:Bind扩展标记进行数据绑定,是在编译阶段完成,至于说性能优化方面,大概主要是优化CPU资源的使用,因为免去了运行阶段进行绑定的过程。当然,使用这个标记仅仅是绑定上的优化,并不包括数据源。数据源的合理提取就得看开发者的策略了,如果你要提取很大批量的数据放到内存中,那么,你是免不了要消耗大量内存的。这个事情,得看实际情况而定了,任何的优化都不是绝对的,个别情况下,不优化反而会更好。

x:Bind在界面绑定不经常变更的情况下用(数据一旦显示到界面,就不再改动),会好一些。如果数据更新频繁,估计Bind和Binding的效果差不多。

在使用x:Bind标记时,可以结合使用x:Phase标记,该标记指定一个整数值,该值是从0开始的,如0、1、2、3等。在数据加载时会根据x:Phase的值来排序,即Phase为0的先加载,1的次之,最后加载2的。Phase的使用有点像ZIndex值。Phase值越大,就越放在后面加载,但值不一定要连续的,你可以设置成0、1、3、4、7。

为啥要弄这玩意儿呢。主要是针对某个数据源实例的某些属性可能无法立刻返回内容的情况。比如,要加载一个山寨汽车的产品列表,可能每款汽车信息都会配上一张图片,以方便用户查看汽车的外观和造型。我们知道,如果数据是从网络上提取的话,图片可能会加载得较慢。要是等所有对象的所有属性都加载完成再显示到界面上,给用户的感觉很不好,你的应用就有可能被差评。

如果用上了x:Phase值,先把汽车型号、山寨厂商名字、配置参数等先加载,Phase设置为0;由于图片比较慢,就将它设为Phase = 1。如此一来,数据在提取时不再等待图片加载就直接显示到界面上;随后,当图片属性返回有效值了再慢慢把图片显示出来。虽然用户看不到山寨车的图片,但至少可以看到汽车的相关信息了。

好,说了那么多废话,咱们还是上实例吧。

首先,我定义了一个Student类,表示一位学生信息,至于说是哪个学校的学生,你就别管了,反正不是女子学校。

    public class Student
{
private string _name;
private string _city;
private int _age;
private float _height; public string Name
{
get { return _name; }
set { _name = value; }
}
public string City
{
get
{
Task.Delay().Wait();
return _city;
}
set { _city = value; }
} public int Age {
get
{
Task.Delay().Wait();
return _age;
}
set { _age = value; }
}
public float Height {
get
{
Task.Delay().Wait();
return _height;
}
set { _height = value; }
}
}

可能有小伙伴看不懂各个属性的get访问器里面是啥意思,如果真是这样,老周觉得应该拉你去批斗,说明你没认真学.net 4.x。Task.Delay方法表示延迟N毫秒的意思,就相当于以前的Thread.Sleep方法。不过嘛,Task的Delay方法的返回类型是Task,这说明它是可以异步等待的,但是,await是用在方法中的,不用于属性,所以为了让代码在这里暂停N毫秒,我还得调用一下Wait方法,这样一来,代码就会停在那里,等Delay完了才会继续执行。

为什么我要在属性的get访问器中拖延一下时间呢,这还用说嘛,当然是为了模拟网速慢,加载慢的情况。

随后,用XAML声明列表控件,并设计一下它的项数据模板,以便能显示Student类的各个属性的值。

        <ListView Name="lv" ReorderMode="Enabled">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Student">
<StackPanel>
<TextBlock FontWeight="Bold" FontSize="24" Text="{x:Bind Name}" x:Phase="0"/>
<TextBlock Text="{x:Bind City}" x:Phase="1"/>
<TextBlock Text="{x:Bind Age}" x:Phase="2"/>
<TextBlock Text="{x:Bind Height}" x:Phase="3"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

各个值的Phase分别是0、1、2、3,让这几个值产生加载的先后顺序。如果不显式设置x:Phase值,就表示它使用默认值0,即立即加载。各位要注意,如果你在DataTemplate模板中用x:Bind标记进行绑定,那么,在DataTemplate上必须用x:DataType标记指明数据源对象的类型。因为这种绑定是在编译阶段完成的,编译必须知道数据源的确切类型,不然的话,容易造成类型安全问题。更何况,你不这样指定,编译器是不会让你编译的。

运行应用程序后,你会看到,学生姓名马上就出来了,但其他属性值会慢慢出现。请看下图表演。

好了,废话就说到这儿了,估计该知识点没什么难度的,别告诉我你没看懂。如果有这个示例你还不懂,那老周只好“伤心秦汉,生灵涂炭,读书人一声长叹”了。

其实,老周这个示例是有超级大Bug的,但为了简单演示,就不管那么多了。

示例源码下载

【Win 10应用开发】分阶段进行数据绑定的更多相关文章

  1. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  2. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  3. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  4. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  5. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  6. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  7. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

  8. 【Win 10 应用开发】Toast通知激活应用——前台&后台

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

  9. 【Win 10 应用开发】通过数据绑定更新进度条

    实现 INotifyPropertyChanged 接口可以在属性更改后通知数据的使用者,这个相信大伙儿都知道.于是,有朋友会问:对于要实时显示进度的情况,比如更新进度条,能用这个实现吗? 当然是可以 ...

随机推荐

  1. HTML DOM 介绍

    本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...

  2. 多个Img标签之间的间隙处理方法

    1.多个标签写在一行 <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> ...

  3. 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()

    1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...

  4. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  5. Angular企业级开发(4)-ngResource和REST介绍

    一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来 ...

  6. 缓存工厂之Redis缓存

    这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...

  7. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  8. Mac OS、Ubuntu 安装及使用 Consul

    Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...

  9. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  10. FullCalendar应用——整合农历节气和节日

    FullCalendar用来做日程管理功能非常强大,但是唯一不足的地方是没有将中国农历历法加进去,今天我将结合实例和大家分享如何将中国农历中的节气和节日整合到FullCalendar中,从而增强其实用 ...