UWP中新加的数据绑定方式x:Bind分析总结
UWP中新加的数据绑定方式x:Bind分析总结
0x00 UWP中的x:Bind
由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML、数据绑定等几个看着十分眼熟的主题。学习过程中倒是也没遇到麻烦。直到在园子里看到了这篇文章:
http://www.cnblogs.com/gaoshang212/p/4534138.html
原来UWP的绑定中新加了个x:Bind,从文章中可以看到x:Bind的效率是很高的。找到MSDN(数据绑定)看了一下(完整的学习目录可参见: http://www.cnblogs.com/durow/p/4878822.html),然后试着写了几个测试程序,对x:Bind也算有所了解了,下面写一下自己的心得体会。
0x01 为什么要搞出个x:Bind
这个问题还是比较容易回答的,因为x:Bind的效率高。毕竟UWP覆盖了手机端,而手机一方面硬件的性能有限,另一方面电池电量也有限,因此节约性能开销有着很大的意义。x:Bind为什么能节约开销呢,因为x:Bind的数据绑定发生在编译时,也就是说在编译的时候View中绑定的什么数据,数据是什么类型的就已经清楚了,绑定工作在编译时即可完成。因此需要我们在后台代码中指定一个类型明确的ViewModel,这样在View中使用x:Bind绑定ViewModel中的数据,一切都是类型明确的。而Binding是在程序运行时才能确定数据源的,属于动态绑定,效率自然不如x:Bind。但从设计上来看,x:Bind使View和ViewModel之间的耦合更紧了,因为必须给View指定一个类型明确的ViewModel。使用x:Bind算是牺牲设计换效率吧,是一种折中的方式。当然如果不喜欢x:Bind也不在乎那点性能,Binding也是可以正常使用的。
0x02 x:Bind的使用方法
1.绑定属性
首先说明一下测试用的Model:

X:Bind和Binding在绑定属性上的区别就是x:Bind在绑定时需要加上ViewModel实例的名称,例如后台代码中创建实例VM

在View中就需要这样绑定:

需要注意的是x:Bind默认的绑定方式是OneTime,即只绑定一次,在使用时记得根据需求改成OneWay或TwoWay。
此外还需要说明的是,x:Bind的绑定是强类型的,如果遇到绑定源为Object(例如绑定ListView的SelectedItem)需要进行强制类型转换。如下图所示,其中local为TestData所在命名空间。

2.绑定命令和事件
绑定命令和属性绑定类似,需要写明ViewModel的实例。在ViewModel中有命令CmdTest如下所示:

在View中就可以这样绑定:

此外很重要的一点就是x:Bind支持绑定事件,看到这个一口老血喷到屏幕上。在WPF中又是引用第三方dll又是写EventToCommand,就是为了绑定个事件传递个事件参数(MVVM设计模式和WPF中的实现(四)事件绑定),如果说刚接触UWP时看到InvokeCommandAction可以传递事件参数还可以用激动来形容的话,看到x:Bind的事件绑定只能是吐血了。我们可以像以前那样把事件绑定到命令,绑定方式可以是Binding也可以是x:Bind,除此之外可以直接使用x:Bind把事件绑定到ViewModel的一个方法上,这个方法可以是无参数的也可以是符合EventHandler签名的。
例如在ViewModel中有两个方法Loaded和Moved:

在View中可以把事件绑定到这两个方法上:

运行起来就像这样:

0x03 Binding的优势
x:Bind提供了一种效率优先的绑定方式,但在有些情况下还是需要用Binding来处理的。除了动态绑定外,目前我能想到的就是Binding的UpdateSourceTrigger,可以指定更新数据源的方式。例如在TextBox的Text发生改变时马上更新数据源,这个x:Bind应该是做不到的吧。还有就是在设计时把DataContext写在XAML里,使用Binding可以在设计时看到数据。随着使用增多,应该还会发现更多的需要使用Binding的情况吧。
0x04 写在最后
x:Bind基本解决了数据/命令/事件绑定的常用场景,对于由此而导致的View和ViewModel的相对紧一点的耦合,我个人是完全可以接受的。因此我个人的原则就是能使用x:Bind的情况下优先使用x:Bind,x:Bind满足不了需求了再使用Binding。
然后再回过头来看看之前写的UWP下的MVVM框架,简直图样。相信随着后面的学习还会不断产生这种感觉;)
最后要说的就是学东西要踏实,不能一味求快,看过的概念再看一遍,温故知新也是好的,何况里面还有新东西。
UWP中新加的数据绑定方式x:Bind分析总结的更多相关文章
- Java中常用加减密方式
1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...
- pyCharm django 中新加app
1.在manage.py@djangotest中输入命令: 1.startapp realnameauth ---新建一个app,名字为realnameauth 2.在 django 项目中的 ...
- Java中两种实现多线程方式的对比分析
本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...
- iOS App中数据加载的6种方式
我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...
- APP中数据加载的6种方式-b
我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...
- 新加了一块硬盘,在bios中可以看的到,在系统的磁盘管理器中看不到新加硬盘
今天新加了一块硬盘,进入bios中可以看到新加的硬盘,但是进入系统后在磁盘管理及磁盘驱动器中都看不到.并且在设备管理器下其他设备出现了ATA channel1,前面显示感叹号,如下图所示: 而且电脑变 ...
- UE4中资源加载资源的方式
在UNITY中,我们加载资源一般是通过Resources.Load(path).即可完成.该方法返回的是Object类型.如果你想要的是材质或者贴图等等,只要价格类型转换的关键字就可以了例如 as M ...
- 淘宝UWP中的100个为什么
从淘宝UWP第一版发布到现在,已经有十个月了,期间收到了用户各种各样的反馈,感谢这些用户的反馈,指导我们不断的修正.完善应用.但是也有一部分需求或建议,由于资源或技术的限制,目前确实无法做到,只能对广 ...
- UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库
在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...
随机推荐
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- SSH实战 · 唯唯乐购项目(中)
用户模块 三:一级分类的查询 创建一级分类表并导入基本数据 CREATE TABLE `category` ( `cid` int(11) NOT NULL AUTO_INCREMENT, ` ...
- 使用Oracle官方巡检工具ORAchk巡检数据库
ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...
- 【开源】.Net Api开放接口文档网站
开源地址:http://git.oschina.net/chejiangyi/ApiView 开源QQ群: .net 开源基础服务 238543768 ApiView .net api的接口文档查看 ...
- java面向对象六原则一法则
1. 单一职责原则:一类只做它该做的事. 2. 里氏替换原则:子类必须能够替换基类(父类),否则不应当设计为其子类. 3. 依赖倒换原则:设计要依赖于抽象而不是具体化. 4. 接口隔离原则:接口要小而 ...
- JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写
要求: 确保字符串的每个单词首字母都大写,其余部分小写. 这里我自己写了两种方法,或者说是一种方法,另一个是该方法的变种. 第一种: function titleCase(str) { var new ...
- HTML5笔记2——HTML5音/视频标签详解
音视频的发展史 早期:<embed>+<object>+文件 问题:不是所有浏览器都支持,而且embed不是标准. 现状:Realplay.window media.Quick ...
- Android中Activity处理返回结果的实现方式
大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界 ...
- can't run roscore 并且 sudo 指令返回 unable to resolve host
I'm using ubuntu14 LTS. Problems: 1. When run roscore, got a mistake and an advice to ping the local ...
- CentOS下Zabbix安装部署及汉化
搭建环境:Centos6.5_x86_64,Zabbix2.4.5,epel 源 服务端: 1.安装开发软件包yum -y groupinstall "Development Tools&q ...