为什么称它为“路径”?
Binding类定义了一个名为Path的属性,用于设置源属性名称。 但为什么它被称为Path? 为什么不叫财产?
Path属性被称为它所调用的属性,因为它不需要是一个属性。 它可以是一组属性,子属性,甚至是与句点相关联的索引器。
以这种方式使用Path可能很棘手,所以这里有一个名为BindingPathDemos的程序,它有四个Binding标记扩展,每个扩展都将Path参数设置为一串属性名和索引器:
这里只有一个元素有一个x:Name,那就是页面本身。 StackLayout的BindingContext是该页面,因此StackLayout中的所有绑定都与页面相关(除了具有显式Source属性集的绑定)。
第一个Binding看起来像这样:
-
<Label Text="{Binding Path=Padding.Top,
-
StringFormat='The top padding is {0}'}" />
Path以页面的Padding属性开头。 该属性的类型为Thickness,因此可以使用Top属性名称访问Thickness结构的属性。 当然,Thickness是一个结构,因此不是从BindableObject派生的,所以Top不能是BindableProperty。 绑定基础结构不能在该属性上设置PropertyChanged处理程序,但它将在页面的Padding属性上设置PropertyChanged处理程序,如果更改,绑定将更新目标。
第二个Binding引用页面的Content属性,即StackLayout。 StackLayout有一个Children属性,它是一个集合,因此它可以被索引:
-
<Label Text="{Binding Path=Content.Children[4].Value,
-
StringFormat='The Slider value is {0:F2}'}" />
Children集合的索引4处的视图是一个Slider(在标记的底部,没有设置属性),它具有Value属性,这就是这里显示的内容。
第三个Binding通过使用x:Static将Source参数设置为静态属性来覆盖其继承的BindingContext。 globe根目录在根标记中定义以引用.NET System.Globalization命名空间,Source设置为CultureInfo对象,该对象封装了用户手机的文化:
-
<Label Text="{Binding Source={x:Static globe:CultureInfo.CurrentCulture},
-
Path=DateTimeFormat.DayNames[3],
-
StringFormat='The middle day of the week is {0}'}" />
CultureInfo的一个属性是DateTimeFormat,它是一个DateTimeFormatInfo对象,包含有关日期和时间格式的信息,包括名为DayNames的属性,该属性是一周中七天的数组。 指数3选出中间指数。
System.Globalization命名空间中的所有类都没有实现INotifyPropertyChanged,但这没关系,因为这些属性的值在运行时不会更改。
最后的Binding引用StackLayout的子节点,子索引为2.这是前一个Label。 它有一个Text属性,其类型为string,string具有Length属性:
-
<Label Text="{Binding Path=Content.Children[2].Text.Length,
-
StringFormat='The preceding Label has {0} characters'}" />
绑定系统为Label的Text属性安装属性更改的处理程序,因此如果更改,绑定将获得新的长度。
对于以下屏幕截图,iOS手机已切换为法语,Android手机已切换为德语。 这会影响Slider值的格式 - 注意逗号而不是小数分隔符的句点 - 以及一周中间日期的名称:
这些路径规范可能很难配置和调试。 请记住,类名称不会出现在仅限路径规范的属性名称和索引器中。 还要记住,您可以逐步构建Path规范,在StringFormat中使用占位符“{0}”测试每个新部分。 这通常会显示设置为Path规范中最后一个属性的值类型的完全限定类名,这可能是非常有用的信息。
在调试器下运行程序时,您还需要关注Visual Studio或Xamarin Studio中的“输出”窗口。 您将看到与绑定基础结构遇到的运行时错误相关的消息。
阅读(982) | 评论(0) | 转发(0) |