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

Posted 云中客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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){}

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

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

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

以上是关于UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解的主要内容,如果未能解决你的问题,请参考以下文章

基于Prism.Windows的UWP开发备忘

Mvvmlight实践一:如果在项目中添加使用Mvvmlight(图文详解)

Xamarin.Android和UWP之MVVM的简单使用

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

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

[UWP小白日记-3]记账项目-1