基于WinRT的Windows Phone 8.1以及Windows 8.1中Xaml数据绑定增加了一些新特性。

FallBackValue属性:FallBackValue在绑定的值属性值不存在时,可以指定一个代替的属性和值显示。

   1:  <TextBlock Text="{Binding Path=badPath, 
   2:             FallbackValue='this is a fallback value'}"     
   3:             Grid.Column="1"> </TextBlock>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

上述代码中设置了FallbackValue属性,也就说当badParh属性值不存在(无返回值)时,将使用“this is a fallback value”文本进行替代显示。

关于FallBackValue属性的详细解释可参考MSDN:

http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.ui.xaml.data.binding.fallbackvalue.aspx

TargetNullValue属性:TargetNullValue在绑定的属性值返回Null时可以指定一个代替的属性或值显示。

   1:  <Button Content="{Binding Path=NextItem, Mode=OneWay, 
   2:  TargetNullValue={Binding Path=NullValue}}" />

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

上述代码中设置了TargetNullValue属性值,也就是说当Button.Content属性绑定的NextItem值为Null,使用NullValue属性值进行显示。

关于TargetNullValue属性的详细解释可参考MSDN:

http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.ui.xaml.data.binding.targetnullvalue.aspx

UpdateSourceTrigger属性:通过设置UpdateSourceTrigger属性值,确定双向绑定的绑定的源更新的执行时间。

其实UpdateSourceTrigger属性早已经出现在WPF和Silverlight中,而Windows Phone 8.1和Windows 8.1中Xaml才引入该属性。

   1:  <TextBox x:Name="NameTxtBox1" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Default}" Width="200" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="1"/>
   2:  <TextBox x:Name="NameTxtBox" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}" Width="200" Grid.Row="2" HorizontalAlignment="Left" Grid.Column="1"/>
   3:  <TextBox x:Name="NameTxtBox3" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Grid.Row="3" HorizontalAlignment="Left" Grid.Column="1"/>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

从上述代码中看到,UpdateSourceTrigger包含3个枚举值。

Default:使用依赖项属性(该属性使用绑定)中的默认行为。在WinRT运行时,实现数据绑定更新的效果等同于PropertyChanged。

PropertyChanged:每当绑定目标值改变时,就会更新绑定源。这由绑定系统自动检测。

Explicit:仅在调用BindingExpression.UpdateSource方法时更新绑定源。

通俗点理解就是,当UpdateSourceTrigger属性值设置为Default或者PropertyChanged时,当更新目标属性值时,数据源会马上进行更新,而设置为Explicit时,需要使用GetBindingExpression方法从某个对象获取BindingExpression,在该对象中存在依赖属性的Binding,然后调用获取的BindingExpression对象的UpdateSource方法更新数据源,代码可以参考如下:

   1:   var expression = NameTxtBox.GetBindingExpression(TextBox.TextProperty);
   2:   expression.UpdateSource();

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

关于UpdateSourceTrigger属性的详细解释可参考MSDN:

http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.ui.xaml.data.binding.updatesourcetrigger.aspx

 

另外关于继承INotifyPropertyChanged的ViewModel中具有属性通知的属性写法,可利用C#5.0中新特性进行优化。

未优化的ViewModel实现方式:

注意红色框,如果有一天项目中ID属性名称发生了更改,其实有很大几率会把NotifyPropertyChanged(“ID”)中”ID“文本忘记更新,这样就会导致无法实现双向绑定的属性值更改通知。

因此我们可以将上述代码进行优化:

上述代码中,优化主要通过CallerMemberName特性实现。CallerMemberName是C#5.0中引入的调用方信息其中一个特性,通过调用方信息可以方便的获取调用方的函数名称和位置。

关于调用方信息详细解释可参考MSDN:

http://msdn.microsoft.com/zh-cn/library/vstudio/hh534540(v=vs.110).aspx

构建基于WinRT的WP8.1 App 02:数据绑定新特性的更多相关文章

  1. 构建基于WinRT的WP8.1 App 03:Page控件

    单页面模板 通常利用Visual Studio 2013创建的最简单的WP8.1应用是Blank App,它只包含一个不带任何UI的页面,并且没有任何状态管理的逻辑. 该不带任何UI的页面称为Blan ...

  2. 构建基于WinRT的WP8.1 App 01:页面导航及页面缓存模式

    本篇博文主要阐述基于Windows Runtime的Windows Phone 应用页面间导航相关知识,主要分为以下几个方面: Window.Frame和Page概览 页面间实现跳转 处理物理后退键 ...

  3. 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读

    阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...

  4. 用 webpack 构建 node 后端代码,使其支持 js 新特性并实现热重载

    https://zhuanlan.zhihu.com/p/20782320?utm_source=tuicool&utm_medium=referral

  5. 基于Html5的移动端APP开发框架

    快速增长的APP应用软件市场,以及智能手机的普及,手机应用:Native(原生)APP快速占领了APP市场,成为了APP开发的主流,但其平台的不通用性,开发成本高,多版本开发等问题,一直困扰着专业AP ...

  6. 构建基于Javascript的移动web CMS——模板

    在上一篇<构建基于Javascript的移动CMS--Hello,World>讲述了墨颀 CMS的大概组成,并进行了一个简单的演示样例,即Hello,World.这一次,我们将把CMS简单 ...

  7. 开发一个基于 Android系统车载智能APP

    很久之前就想做一个车载相关的app.需要实现如下功能: (1)每0.2秒更新一次当前车辆的最新速度值. (2)可控制性记录行驶里程. (3)不连接网络情况下获取当前车辆位置.如(北京市X区X路X号) ...

  8. 使用PowerApps快速构建基于主题的轻业务应用 —— 入门篇

    作者:陈希章 发表于 2017年12月12日 前言 在上一篇文章 基于Office 365的随需应变业务应用平台 中我提到,随着随需应变的业务需要,以及技术的发展,业务应用的开发的模式也有了深刻的变化 ...

  9. 构建基于Javascript的移动web CMS——Hello,World

    在一篇构建基于Javascript的移动web CMS入门--简单介绍中简单的介绍了关于墨颀CMS的一些原理,其极框架组成.于是開始接着应该说明一下这个CMS是怎样一步步搭建起来. RequireJS ...

随机推荐

  1. Dynamic CRM 2013学习笔记(二十)字段改变事件的二种实现方法

    CRM里有二种方式实现字段change事件,一种是在form里,一种完全通过js来实现.本文介绍下二者的用途及区别. 1. Form里用法 这种方式估计其实也是添加一个js的function. 这种方 ...

  2. ASP.NET Core 1.0 中使用 Swagger 生成文档

    github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...

  3. CBA 赛程的笔记 - 北京首钢

    2014-11-01 19:35 北京首钢 103:89 广东宏远 结束 技术统计  发挥不错,打的比较好! 2014-11-05 19:35 八一双鹿 89:100 北京首钢 结束 技术统计  第一 ...

  4. [JS2] JS是弱类型

    <html> <head> <title>JavaScript 是弱类型的</title> <Script Language="Java ...

  5. Linux:常用快捷键

    按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相 ...

  6. Jenkins2 - 下载与启动

    文章来自:http://www.ciandcd.com 文中的代码来自可以从github下载: https://github.com/ciandcd 本文将引导jenkins初学者安装和配置jenki ...

  7. H5 Canvas刮刮乐

    玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个 ...

  8. 01_JavaScript简介

    js用途 前端三层 结构层 HTML 从主义角度描述页面的结构 样式层 CSS 从审美的角度装饰页面 行为层 JS 从交互角度提升体验 HTML 里面的 b(加粗)/i(倾斜)/u(下划线)等标签由于 ...

  9. Atitit selenium3 新特性

    Atitit selenium3 新特性     Selenium2.0 支持了webdriver  api,,原来自己的api放弃了. Selenium v2.45.0 发布,支持Firefox 3 ...

  10. Windows环境下32位汇编语言程序设计(典藏版)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...