UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解

{x:bind}是随着UWP被推出而被添加的,可以说是Win10 UWP开发专有扩展。虽然 {x:Bind} 缺少{Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Binding} 要少,且支持更好的调试。

参照网址:{x:Bind} 标记扩展GitHub微软UWP实例之XamlBind

1,{x:Bind} 基本原理

在 XAML 加载时,{x:Bind} 将转换为你所需的绑定对象,此对象将从数据源上的某一属性中获取相关值。绑定对象可以配置为观察数据源属性值的更改,并基于这些更改自行刷新。该对象也可以配置为将其自己的值的更改推送回源属性。

2,{x:bind}{Binding}两者区别

  • {x:Bind}{Binding} 创建的绑定对象在功能上大致等同。
  • {x:Bind} 执行编译时所生成的专用代码,而 {Binding} 使用通用的运行时对象检查。
  • {x:Bind} 绑定(通常指已编译的绑定)具有出色的性能、提供编译时对绑定表达式的验证,并支持通过允许你在作为页面的部分类生成的代码文件中设置断点进行调试。可以在 obj文件夹中找到这些文件,其名称类似于(适用于 C#)<view name>.g.cs
  • {x:Bind} 不将 DataContext 用作默认源 — 它将改用页面或用户控件本身。因此,它将针对属性、字段和方法查找代码隐藏的页面或用户控件。要向 {x:Bind} 显示视图模型,你通常需要将新字段或属性添加到代码隐藏的页面或用户控件。属性路径中的步骤由点号分隔 (.),并且可包含多个分隔符以遍历连续的子属性。
  • 使用 x:Bind 时,无需将 ElementName=xxx 用作绑定表达式的一部分。使用 x:Bind 时,你可以使用元素的名称作为绑定路径的第一部分,因为已命名的元素变为表示根绑定源的页面或用户控件内的字段。
  • 事件绑定是编译绑定的一项新功能。它允许你使用绑定为事件指定处理程序,而无需使其成为代码隐藏的方法。
  • 在将 {x:Bind} 用于数据模板时,需通过设置 x:DataType 值来指示要绑定到的类型,你也可以将类型设置为接口或基类类型,然后按需使用转换,从而编写一个完整的表达式。

3,{x:Bind}基本用法

<object property="{x:Bind}" .../> -or- <object property="{x:Bind propertyPath}" .../> -or- <object property="{x:Bind bindingProperties}" .../> -or- <object property="{x:Bind propertyPath, bindingProperties}" .../>

 
propertyPath 一个指定绑定的属性路径的字符串
bindingProperties
propName=value[, propName=value]*

使用一个名称/值对语法指定的一个或多个绑定属性

propName 要在绑定对象上设置的属性的字符串名称
value 要将属性设置为的值。参数的语法取决于要设置的属性。

备注:PropertyPath{x:Bind} 表达式设置 PathPath 是一个属性路径,用于指定要绑定到的(源)属性、子属性、字段或方法的值。你可以明确指出 Path 属性名称:{Binding Path=...}。也可以将其省略:{Binding ...}

4,{x:Bind}属性设置

Path 属性路径
Converter 指定绑定引擎所调用的转换器对象。转换器可在 XAML 中设置,但只能在你引用已在 XAML 中的 ResourceDictionary中分配的对象实例时设置。你可以使用资源字典中对该对象的 {StaticResource} 标记扩展引用。
ConverterLanguage 指定转换器要使用的区域性。(如果你要设置 ConverterLanguage,则还应设置 Converter。)区域性可设置为一个基于标准的标识符。有关详细信息,请参阅 ConverterLanguage
ConverterParameter 指定可在转换器逻辑中使用的转换器参数。 (如果你要设置 ConverterParameter,则还应设置 Converter。)大多数转换器使用可从要转换的传递值获取所有所需信息的简单逻辑,不需要 ConverterParameter值。ConverterParameter 参数适用于具有多个逻辑的中等高级转换器实现,这些逻辑可切断传入ConverterParameter 的内容。你可以编写一个转换器,使用除字符串之外的值,但这种情况并不常见,请参阅ConverterParameter 中的备注,以获取详细信息。
FallbackValue 指定要在无法解析源或路径时显示的值。
Mode 将绑定模式指定为以下一种字符串:"OneTime"、"OneWay" 或 "TwoWay"。默认值是 "OneTime"。请注意,该值不是{Binding} 的默认值,大多数情况下为"OneWay"。
TargetNullValue 指定要在源值解析但并非显式 null 时显示的值。

备注:OneTime只作为显示,OneWay实现了INotifyPropertyChanged的属性接收状态变更,TwoWay实现了INotifyPropertyChanged的交互属性。

5,常见例子

  • Text="{x:Bind Employee.FirstName}" 绑定成员
  • Text="{x:Bind Model.Employees[0].Name}"绑定集合对象成员
  • Text="{x:Bind Model.ManagerProp.ReportsOC[0].Name, Mode=OneTime}"深层次绑定
  • Text="{x:Bind Model.Employees[0], Mode=OneTime}"绑定对象自动调用ToString()方法输出字符串
  • Value="{x:Bind Model.IntPropertyDP, Mode=TwoWay, Converter={StaticResource IntToDouble}}"
  • Visibility="{x:Bind Model.BoolPropWithINPC, Mode=OneWay, Converter={StaticResource BoolToVisibility}}"
  • Text="{x:Bind LocalTextBox.Text.Length, Mode=OneWay}"
  • Grid.Column="{x:Bind Model.IntPropWithINPC, Mode=OneWay}"
  • Grid.Column="{x:Bind OneTimeSlider3.Value, Mode=OneWay, Converter={StaticResource DoubleToInt}}"
  • Text="{x:Bind Background.(SolidColorBrush.Color), FallbackValue=‘This is my fallback value‘, Mode=OneWay}"
  • Text="{x:Bind NullStringProperty, TargetNullValue=‘This is a null string property‘}"
  • Text="{x:Bind Button22.(Grid.Row)}" 绑定附加属性
  • Text="{x:Bind obj.(TextBox.Text)}"obj 为类型对象的属性,包含一个文本框
  • Text="{x:Bind groups3[0].(data:SampleDataGroup.Title)}"groups3 字段是一个对象字典,必须将其转换为data:SampleDataGroup
  • Click="{x:Bind rootFrame.GoForward}"事件绑定

public void GoForward(object sender, RoutedEventArgs e){}

private void GoForward(){}

private void GoForward(object sender, object e){}

对于事件,目标方法不能重载,而且还必须:

  • 匹配事件的签名。
  • 或者没有任何参数。
  • 或者具有相同数量的参数类型,这些参数根据事件参数的类型进行赋值。

在生成的代码隐藏中,已编译的绑定将处理事件并将其路由到模型上的对应方法,并在该事件发生时计算绑定表达式的路径。这意味着,与属性绑定不同的是,它不跟踪模型的更改。

时间: 2024-10-25 06:29:33

UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解的相关文章

UWP开发之Mvvmlight实践七:寻找Mobile模拟器或者实体机中Packages文件夹小技巧

在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录? 桌面系统应用 安装在桌面系统上的应用,我们是很容易就可以找到安装包的目录. 目录结构:C:\Users\{用户名}\AppData\Local\Packages\{UWP应用包名}\ {用户名}=系统登录用户名,{UWP应用包名}=UWP应用打包时的名称. 比如查看[UWP开发之Mvvmligh

UWP开发之Mvvmlight实践九:基于MVVM的项目架构分享

在前几章介绍了不少MVVM以及Mvvmlight实例,那实际企业开发中将以那种架构开发比较好?怎样分层开发才能节省成本? 本文特别分享实际企业项目开发中使用过的项目架构,欢迎参照使用!有不好的地方欢迎指点! 基于MVVM的UWP项目架构 每个项目或者目录下需要什么文件如下图所示: 项目参照关系: 备注:如果使用Entity Framework Core做ORM持久层,只需要将UA.DataAccess层做替换就可以.希望本文能对您的团队开发带来一定功效.

UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理

最近比较忙有一段时间没有更新了,再接再厉继续分享. 先我们看看App在生命周期中会出现那些状态: 详细介绍参考官网:App lifecycle  https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle 一般情况: 比如用新闻APP看新闻的时候突然收到邮件,然后跳转到邮件APP查看邮件,查看完了再回到APP继续看新闻. 这个时候如果不做中断挂起处理的话,是很难保证APP会恢复到跳转之前的状态.之所以说很难保证

UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)

最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题.实在没办法只能记录每个步骤的Log,通过查看Log发现是SuspensionManager的DataContractSerializer序列化抛出了ArgumentNullException异常. 常见.NET Native引发异常: 例1: System.InvalidCastException:

UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)

最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)]已经谈到了使用FileOpenPicker进行文件选择,以及CameraCaptureUI进行拍照. 对于文件选择一般进行如下设置就能实现: // 选择多个文件 FileOpenPicker openPicker = new FileOpenPicker(); openPic

UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软推荐使用Sqlite吧! 2,简单!就只有一个类库没有多余的参照什么的.不像其他数据库还得做复杂配置什么的麻烦! 3,不需要数据库服务,数据服务和客户都在同一个进程里面.如下图: 4,作为存储系统它只支持一个用户一个数据实体. 5,跨平台跨结构,这个好! Sqlite主要使用内容 如果想充分使用好S

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

【转】Android应用开发之PNG、IconFont、SVG图标资源优化详解

1 背景 最近因为一些个人私事导致好久没写博客了,多事之年总算要过去了,突然没了动力,所以赶紧先拿个最近项目中重构的一个小知识点充下数,老题重谈. 在我们App开发中大家可能都会有过如下痛疾(程序员和设计妹妹注意喽): 好多小的图标好烦人,又占体积还要考虑分辨率,一拉伸就模糊等. 同一个图标不同状态还有不同颜色的多张. 总是幻想IOS.Android.Web等对于一个图标只切一次图多好. 如果你有过类似的痛疾那么下面讨论的故事就是一个完美的解决方案,当然了,采用下面方案对于重型应用或者固件级的优

Android应用开发之PNG、IconFont、SVG图标资源优化详解

1 背景 最近因为一些个人私事导致好久没写博客了,多事之年总算要过去了,突然没了动力,所以赶紧先拿个最近项目中重构的一个小知识点充下数,老题重谈. 在我们App开发中大家可能都会有过如下痛疾(程序员和设计妹妹注意喽): 好多小的图标好烦人,又占体积还要考虑分辨率,一拉伸就模糊等. 同一个图标不同状态还有不同颜色的多张. 总是幻想IOS.Android.Web等对于一个图标只切一次图多好. 如果你有过类似的痛疾那么下面讨论的故事就是一个完美的解决方案,当然了,采用下面方案对于重型应用或者固件级的优