使用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. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  5. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  6. SSH实战 · 唯唯乐购项目(下)

    后台模块 一:后台用户模块 引入后台管理页面 创建adminuser表: CREATE TABLE `adminuser` (   `uid` int(11) NOT NULL AUTO_INCREM ...

  7. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  8. spring applicationContext.xml和hibernate.cfg.xml设置

    applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  9. Unable to create the selected property page. An error occurred while automatically activating bundle net.sourceforge.pmd

    解决方案: 在命令行到eclipse目录下使用 eclipse.exe -clean

  10. javaScript中的小细节-script标签中的预解析

    首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...