上周打炉石打得太晚……忘记更新了,本周补上。本篇我们讲一下{x:Bind}扩展标记。{x:Bind}扩展标记也是Windows 10 Uinversal 新增的内容,按官方的说法是 {Binding} 的备用选项。虽然 {x:Bind} 缺少 {Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Binding} 要少,且支持更好的调试。

首先我们来看一下{x:Bind}的基本用法:

  1. <Page
  2. x:Class="XBindTest.MainPage"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:XBindTest"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9.  
  10. <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  11. <TextBlock Text="{x:Bind HelloWorld}"></TextBlock>
  12. </Grid>
  13. </Page>
  1. public sealed partial class MainPage : Page
  2. {
  3. public string HelloWorld { get; set; }
  4.  
  5. public MainPage()
  6. {
  7. this.InitializeComponent();
  8. this.HelloWorld = "Hello World";
  9. }
  10. }

  和原先使用的Binding最大的不同,就是不需要设置DataContext,而是从Page(或者UserControl)来寻找属性进行绑定。值得注意的是,可能是为了强调性能,{x:Bind}的默认绑定Mode是OneTime,而不是OneWay。之前Binding写得太多的各位可能会思维定势而忘记修改Mode。

  有的同学可能会说,既然以Page作为绑定的默认源,是不是意味着就木有ViewModel啥事了,以后代码就一股脑都写在Page.cs里了?当然不是啦,因为每个Page里写个ViewModel是很常见的事情啊,再通过ViewModel来进一层绑定属性就可以了。

  1. public sealed partial class HostView : Page
  2. {
         public HostViewModel ViewModel { get; set; }
  3. public HostView()
  4. {
  5. this.InitializeComponent();
  6. this.ViewModel = new HostViewModel();
  7. }
  8. }
  1. <Page x:Class="QuizGame.View.HostView" ... >
  2. <Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
  3. </Page>

  {x:Bind}还有一个非常神奇的地方,就是Xaml里写了就可以直接在Design视图显示出来。而Binding则是没有办法做到的,这是因为{x:Bind} 在编译时就已经生成了一些奇怪的代码(位于对应的Page.g.cs文件,该文件可以在obj文件夹中找到)而 {Binding} 则是在运行时才获取对象进行绑定。所以{x:Bind}才能具有更好的性能。

  在g.cs文件中我们可以找到这样的代码:

  1. private void Update_HelloWorld(global::System.String obj, int phase)
  2. {
  3. if((phase & (( << ) | NOT_PHASED )) != )
  4. {
  5. XamlBindingSetters.Set_Windows_UI_Xaml_Controls_TextBlock_Text(this.obj2, obj, null);
  6. }
  7. }
  8. public static void Set_Windows_UI_Xaml_Controls_TextBlock_Text(global::Windows.UI.Xaml.Controls.TextBlock obj, global::System.String value, string targetNullValue)
  9. {
  10. if (value == null && targetNullValue != null)
  11. {
  12. value = targetNullValue;
  13. }
  14. obj.Text = value ?? global::System.String.Empty;
  15. }

  在需要的时候,就可以打个断点进行调试了,虽然我觉得然并卵……

  接下来说的非常重要,就是在DataTemplate中如何使用{x:Bind},稍稍有别于在Page的Xaml里,在DataTemplate中使用{x:Bind}必须要表明绑定的数据类型:

  1. <ListView ItemsSource="{x:Bind PersonList}">
  2. <ListView.ItemTemplate>
  3. <DataTemplate x:DataType="local:Person">
  4. <TextBlock Text="{x:Bind Name}"></TextBlock>
  5. </DataTemplate>
  6. </ListView.ItemTemplate>
  7. </ListView>

  还是那句话,{x:Bind}是在编译时处理绑定的,必须明确知道数据类型才能在g.cs里生成一些奇怪的辅助信息。

  看看下面这张截图,因为类型都在g.cs里都生成好了,所以Design视图里才能根据Xaml生成对应的展示数据,这是Binding所做不到的。

  

  上面说了这么多{x:Bind}的优点,你是不是有些心动了呢?但是!终于到了说但是的时间了,{x:Bind}还是存在一些比不过Binding的地方:

  • {x:Bind}不支持Source的用法,比如下面这个常用的功能就实现不了,乖乖滚回Binding的怀抱。Visibility="{Binding Settings.Accessibility,Source={StaticResource Locator}
  • 另外呢,UpdateSourceTrigger也是不支持的。Text="{Binding Email,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
  • 还有呢,如果你想把{x:Bind}写到ResouceDirectory里,更是一件麻烦的事情,你需要给ResouceDirectory创建一个class,然后人肉添加类似InitializeComponent的方法……想想都觉得还是算了,哎呀我不想写了……
  • 如果你之前经常写C# code来创建Binding,那么{x:Bind}又会让你失望了,完全不支持……

  除了以上这些,{x:Bind}还会诱使一种叫做代码洁癖的疾病发生。你想啊,都把DataType写到Xaml里了,这特么眼里还有没有MVVM和王法了,类型都暴露了一点隐私都没有了。底下写Service的同事(请不要误会底下的意思,这不是体位描写)说:哎哟不好意思,我重构代码把类型改了。你一看要改N个Xaml文件,抄起一把椅子就砸过去了,然后就被派出所带走了……

  所以这里还是需要通过接口来减少依赖,举个例子在MainPage里通过IViewModel,而不是具体的MainViewModel来绑定,在DataTemplate里通过IPerson,而不是Person类型。这部分是面向对象的知识了,就不展开讨论了。

  本篇到此打住,再去开一盘炉石,我就不信萨满打不上传说……

UWP开发入门(三)——{x:Bind}扩展标记的更多相关文章

  1. UWP开发入门(十)——通过继承来扩展ListView

    本篇之所以起这样一个名字,是因为重点并非如何自定义控件,不涉及创建CustomControl和UserControl使用的Template和XAML概念.而是通过继承的方法来扩展一个现有的类,在继承的 ...

  2. UWP开发入门(四)——自定义CommandBar

    各位好,再次回到UWP开发入门系列,刚回归可能有些不适应,所以今天我们讲个简单的,自定义CommandBar,说通俗点就是自定义类似AppBarButton的东西,然后扔到CommandBar中使用. ...

  3. UWP开发入门(十六)——常见的内存泄漏的原因

    本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...

  4. UWP开发入门系列笔记之(一):UWP初览

    标签: 随着微软Build2015带来的好消息,Win10正式版发布的日子已经离我们越来越近了,我们也终于欣喜地看到:一个统一的Windows平台对于开发人员来说充满了吸引力,这局棋下的好大的说--于 ...

  5. UWP开发入门(25)——通过Radio控制Bluetooth, WiFi

    回顾写了许久的UWP开发入门,竟然没有讲过通过Windows.Devices.Radios.Radio来控制Bluetooth和WiFi等功能的开关.也许是因为相关的API设计的简单好用,以至于被我给 ...

  6. UWP开发入门(七)——下拉刷新

    本篇意在给这几天Win10 Mobile负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难.UWP开发更大的困难在于懒惰,缺乏学习的意愿.而不是“某软连下拉刷新控件都没有”这样的想法. 之 ...

  7. UWP开发入门(二十三)——WebView

    本篇讨论在UWP开发中使用WebView控件时常见的问题,以及一些小技巧. WebView是实际开发中常用的控件,很多大家抱怨的套网页的应用都是通过WebView来实现的.这里要澄清一个问题,套网页的 ...

  8. UWP开发入门(十一)——Attached Property的简单应用

    UWP中的Attached Property即附加属性,在实际开发中是很常见的,比如Grid.Row: <Grid Background="{ThemeResource Applica ...

  9. UWP开发入门(二)——RelativePanel

    RelativePanel也是Win10 UWP新增的控件,和上篇提到的SplitView一样在UWP的UI布局起到非常重要的作用.说句实在话,这货其实就是为了UWP的Adaptive UI而特意增加 ...

随机推荐

  1. django-渲染页面+locals

    from django.shortcuts import render, redirect from django.views import View from django.http import ...

  2. Git 软件开发过程

    一.关于Git与Subversion的区别 二.目前我们用Subversion是怎么执行软件过程的 三.优势与缺点 架构 * Git:分布式,所有的teammates本地可以clone一份独立完整的仓 ...

  3. springmvc框架自带的异常处理器SimpleMappingExceptionResolver的使用

    使用分三步 1.定义异常类 2.在处理器中的用法 3.在springmvc配置文件中需要加配置

  4. Ssm框架常见报错

    错误1: The origin server did not find a current representation for the target resource or is not willi ...

  5. js 倒计时功能,获取当前时间的年月日,时分秒

    一.实现当前时间到指定截止时间的倒计时功能 <html> <head> <title>TEST</title> </head> <bo ...

  6. SVG脚本编程简介

    本文主要介绍SVG的脚本编程,并分别给出放大.缩小,查询,鼠标事件等实例. 一. SVG简介 SVG,全称为Scalable Vector Graphics(可伸缩矢量图形).它是W3C制定的.用矢量 ...

  7. CMDB之数据采集

    一. 四种方式 1. Agent方式 api - URL - 发送数据格式 - 返回值 agent - 采集数据,发送数据 好处: - 简单 - 采集速度快,响应速度快 坏处: - 每台agent装的 ...

  8. Mockplus组件样式库一键解决风格复用

    在Mockplus3.3版本中,新增了组件样式库,可以快速复用组件风格,同时可以将组件风格保存到库中. 官网地址:https://www.mockplus.cn 1. 保存样式 选中组件,设置好该组件 ...

  9. 【原创】请避免GO语言中的携程空跑(CPU突然激增)

    其实GO语言从1.6版本开始非常不错了,GC性能优化非常到位,并且各种并行设计比从新实现一套C++版本的确是方便不少. 语言包也很多,库也相对稳定,完全可以适用于生产环境. 本文主要是给刚刚入门新手注 ...

  10. 11 Mortal Fibonacci Rabbits

    Problem Figure 4. A figure illustrating the propagation of Fibonacci's rabbits if they die after thr ...