使用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. 【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划

    发个通知,过段时间学习计划相关的东西就出来了,上次写了篇指引文章后有些好奇心颇重的人跟我说:“发现最近群知识库和技能库更新的频率有点大,这是要放大招的节奏啊!” 很多想学习却不知道如何规划的人想要一个 ...

  2. js获取给定月份的N个月后的日期

    1.在讲js获取给定月份的N个月后的日期之前,小颖先给大家讲下getFullYear().getYear()的区别. ①getYear() var d = new Date() console.log ...

  3. gitHub使用入门和github for windows的安装教程

    在看这篇教程之前我想大家也在搜索怎样使用gitHub托管自己的项目,在使用gitHub之前我也遇到过各种问题,在网上我也搜索了很多,但总觉得网上搜索到的东西很多很杂,有的根本不知道是在表达什么.在这过 ...

  4. 如何避免git每次提交都输入密码

    在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...

  5. 步入angularjs directive(指令)--准备工作熟悉hasOwnProperty

    在讲解directive之前,先做一下准备工作,为何要这样呢? 因为我们不是简单的说说directive怎么用,还要知道为什么这么用!(今天我们先磨磨刀!). 首先我们讲讲js 基础的知识--hasO ...

  6. 破解SQLServer for Linux预览版的3.5GB内存限制 (UBUNTU篇)

    在上一篇中我提到了如何破解RHEL上SQLServer的内存大小限制,但是Ubuntu上还有一道检查 这篇我将会讲解如何在3.5GB以下内存的Ubuntu中安装和运行SQLServer for Lin ...

  7. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。

    成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...

  8. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  9. JavaScript基础学习-函数及作用域

    函数和作用域是JavaScript的重要组成部分,我们在使用JavaScript编写程序的过程中经常要用到这两部分内容,作为初学者,我经常有困惑,借助写此博文来巩固下之前学习的内容. (一)JavaS ...

  10. H3 BPM:为石化企业提供一个不一样的全停大修平台

    H3 BPM大型炼化企业装置全停检修管理平台(简称"全停大修")结合国际化的流程管理理念.成熟的系统技术架构.优秀的行业解决方案,为石油化工行业全停大修提供了卓越的信息化管理方案, ...