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. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  2. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  3. Spring框架概述

    Spring是最流行的Java企业级应用开发框架,全球数以百万的开发者在使用Spring框架创建高性能.易测试.可重用的代码. Spring框架的核心特性可以应用于任何Java应用,但扩展的JavaE ...

  4. Modify Branding of FreeCAD

    Modify Branding of FreeCAD eryar@163.com This article describes the Branding of FreeCAD. Branding me ...

  5. 一步一步教你用CSS画爱心

    今天小颖给大家分享一个用CSS画的爱心,底下有代码和制作过程,希望对大家有所帮助. 第一步: 先画一个正方形.如图: <!DOCTYPE html> <html> <he ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  9. H3 BPM让天下没有难用的流程之技术体系

    一.技术架构 H3 BPM 基于微软.NET 技术架构,采用C#语言开发,以高开放.高扩展.高性能为核心准则,遵循分层的设计原理,结合最新的B/S 以及智能手机应用开发技术研发的. 图:H3 BPM  ...

  10. iOS系列教程 目录 (持续更新...)

      前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...