使用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. OpenSceneGraph in ActiveX by ActiveQt

    OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt ...

  2. [WCF]缺少一行代码引发的血案

    这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...

  3. c#多线程

    一.使用线程的理由 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使用线程来简化编码. 3.可以使用线程来实现并发执行. 二.基本知识 1.进程与线程:进程作为操作系统执行程序 ...

  4. PHP之使用网络函数和协议函数

    使用其他Web站点的数据 <html> <head> <title> Stock Quote From NASDAQ </title> </hea ...

  5. 《LoadRunner12七天速成宝典》来了

    看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...

  6. iOS开发 适配iOS10

    2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从Notificat ...

  7. 手把手教你做个人 app

    我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示:另外,开发一个app,还需要美工协助切图.没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先 ...

  8. Mysql - 存储过程/自定义函数

    在数据库操作中, 尤其是碰到一些复杂一些的系统, 不可避免的, 会用到函数/自定义函数, 或者存储过程. 实际项目中, 自定义函数和存储过程是越少越好, 因为这个东西多了, 也是一个非常难以维护的地方 ...

  9. SqlServer简单数据分页

    手边开发的后端项目一直以来都用的.NET MVC框架,访问数据库使用其自带的EF CodeFirst模式,写存储过程的能力都快退化了 闲来无事,自己写了条分页存储过程,网上类似的文章多的是,这里只列了 ...

  10. echo命令

    linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的 ...