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分析总结的更多相关文章

  1. Java中常用加减密方式

    1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...

  2. pyCharm django 中新加app

    1.在manage.py@djangotest中输入命令: 1.startapp   realnameauth   ---新建一个app,名字为realnameauth 2.在 django 项目中的 ...

  3. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  4. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  5. APP中数据加载的6种方式-b

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  6. 新加了一块硬盘,在bios中可以看的到,在系统的磁盘管理器中看不到新加硬盘

    今天新加了一块硬盘,进入bios中可以看到新加的硬盘,但是进入系统后在磁盘管理及磁盘驱动器中都看不到.并且在设备管理器下其他设备出现了ATA channel1,前面显示感叹号,如下图所示: 而且电脑变 ...

  7. UE4中资源加载资源的方式

    在UNITY中,我们加载资源一般是通过Resources.Load(path).即可完成.该方法返回的是Object类型.如果你想要的是材质或者贴图等等,只要价格类型转换的关键字就可以了例如 as M ...

  8. 淘宝UWP中的100个为什么

    从淘宝UWP第一版发布到现在,已经有十个月了,期间收到了用户各种各样的反馈,感谢这些用户的反馈,指导我们不断的修正.完善应用.但是也有一部分需求或建议,由于资源或技术的限制,目前确实无法做到,只能对广 ...

  9. UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

    在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...

随机推荐

  1. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...

  2. 3.Windows Server 2012 R2数据库部署

    很多人竟然不会安装数据库....好吧,来个图文教程,其实和windows里面一样安装,和安装2008一样的 先安装3.5:http://www.cnblogs.com/dunitian/p/53487 ...

  3. Android和JavaScript相互调用的方法

    转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...

  4. 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. jquery实现下拉框多选

    一.说明 本文是利用EasyUI实现下拉框多选功能,在ComboxTree其原有的基础上对样式进行了改进,样式表已上传demo,代码如下 二.代码 <!DOCTYPE html PUBLIC & ...

  6. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  7. 学习笔记:delphi之TStringGrid

    1.说明 最近加入了一个项目组,使用的开发工具是delphi6,想想又要开始搞这个工具有点小忧伤,但没办法谁让咱就是个打杂的尼... 的需求是显示一个类似于Word/excel的那种表格,可以合并列等 ...

  8. KVM安装部署

    KVM安装部署 公司开始部署KVM,KVM的全称是kernel base virtual machine,对KVM虚拟化技术研究了一段时间, KVM是基于硬件的完全虚拟化,跟vmware.xen.hy ...

  9. 【初码干货】在Window Server 2016中使用Web Deploy方式发布.NET Web应用的重新梳理

    在学习和工作的过程中,发现很多同事.朋友,在做.NET Web应用发布的时候,依然在走 生成-复制到服务器 这样的方式,稍微高级一点的,就是先发布到本地,再上传到服务器 这种方式不仅效率低下,而且不易 ...

  10. Java中的Checked Exception——美丽世界中潜藏的恶魔?

    在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...