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 ...
随机推荐
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- win10 环境 gitbash 显示中文乱码问题处理
gitbash 是 windows 环境下非常好用的命令行终端,可以模拟一下linux下的命令如ls / mkdir 等等,如果使用过程中遇到中文显示不完整或乱码的情况,多半是因为编码问题导致的,修改 ...
- NodeJs之调试
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...
- 对抗假人 —— 前后端结合的 WAF
前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...
- 3.Windows Server 2012 R2数据库部署
很多人竟然不会安装数据库....好吧,来个图文教程,其实和windows里面一样安装,和安装2008一样的 先安装3.5:http://www.cnblogs.com/dunitian/p/53487 ...
- 03.LoT.UI 前后台通用框架分解系列之——多样的表格
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- MySQL数据库和InnoDB存储引擎文件
参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- C#数组,List,Dictionary的相互转换
本篇文章会向大家实例讲述以下内容: 将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dicti ...
- C# 生成验证码图片时消除锯齿
引言 基于生成图片实现了一个手机号转图片的需求. 内容也很简单,直接用手机号生成一个png图片.就是为了背景透明以便其他地方调用. 有无锯齿主要依靠一句代码:g.TextRenderingHint= ...