使用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. SQL Server 数据加密功能解析

    SQL Server 数据加密功能解析 转载自: 腾云阁 https://www.qcloud.com/community/article/194 数据加密是数据库被破解.物理介质被盗.备份被窃取的最 ...

  2. Sublime的使用

    1.一个可扩展性强的编辑工具 2.如何安装扩展 通过View->Show Console菜单打开命令行. 按图操作: 在控制台输入,然后回车: import urllib.request,os; ...

  3. Sublime配置python开发环境

    Package Control Package Control 是Sublime 里直接安装附加插件的包管理器.可以通过以下步骤手动安装: 1.点击Preferences > Browse Pa ...

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

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

  5. 手机web如何实现多平台分享

    话说App一般都带有分享到社交平台的入口,web网页的分享也有很不错的框架,但是随着HTML5的不断发展,手机web页面越来越多的进入到我们的生活中,那如何在我们的手机上完成分享呢?话说各大分享平台都 ...

  6. android SystemServer.java启动的服务。

    EntropyService:熵(shang)服务,用于产生随机数PowerManagerService:电源管理服务ActivityManagerService:最核心服务之一,Activity管理 ...

  7. Mysql - 触发器/视图

    触发器在之前的项目中, 应用的着实不多, 没有办法的时候, 才会去用这个. 因为这个东西在后期并不怎么好维护, 也容易造成紊乱. 我最近的项目中, 由于数据库设计(别人设计的)原因, 导致一些最简单功 ...

  8. mysql删除重复记录语句的方法

    例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...

  9. [转] 从知名外企到创业公司做CTO是一种怎样的体验?

    这是我近期接受51CTO记者李玲玲采访的一篇文章,分享给大家. 作者:李玲玲来源:51cto.com|2016-12-30 15:47 http://cio.51cto.com/art/201612/ ...

  10. css样式让input垂直居中

    css样式让input垂直居中 css代码: .div1{ border: 1px solid #CCC; width:1120px; height:40px; margin:auto; displa ...