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. js复杂对象和简单对象的简单转化

    var course = { teacher :{ teacherId:001, teacherName:"王" }, course : { courseId : 120, cou ...

  2. HTML5 localStorage本地存储

    介绍 localStorage(本地存储)的使用方式.包括对存储对象的添加.修改.删除.事件触发等操作. 目录 1. 介绍 1.1 说明 1.2 特点 1.3 浏览器最小版本支持 1.4 适合场景 2 ...

  3. IE的F12开发人员工具不显示问题

    按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的缩略图上,右键-最大化,工具就全屏出现 ...

  4. nodejs进阶(2)—函数模块调用

    函数调用 1. 文件内普通函数调用 创建一个js文件命名为2_callFunction.js,其中定义一个函数fun1,向返回对象输出了一段字符串“你好,我是fun1”. //------------ ...

  5. JavaScript特性(attribute)、属性(property)和样式(style)

    最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...

  6. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  7. Spring resource bundle多语言,单引号format异常

    Spring resource bundle多语言,单引号format异常 前言 十一假期被通知出现大bug,然后发现是多语言翻译问题.法语中有很多单引号,单引号在format的时候出现无法匹配问题. ...

  8. javascript动画系列第四篇——拖拽改变元素大小

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

  9. javascript运动系列第一篇——匀速运动

    × 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...

  10. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...