Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4754791
  • 博文数量: 890
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8621
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(890)

文章存档

2020年(7)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2019-10-27 20:41:30

绑定模式

这是一个Label,其FontSize属性绑定到Slider的Value属性:

点击(此处)折叠或打开

  1. <Label FontSize="{Binding Source={x:Reference slider},
  2.                           Path=Value}" />
  3. <Slider x:Name="slider"
  4.         Maximum="100" />

这应该工作,如果你尝试,它会工作。 您可以通过操纵Slider来更改Label的FontSize。
但这里是一个标签和滑块与绑定相反。 而不是作为目标的Label的FontSize属性,现在FontSize是数据绑定的源,目标是Slider的Value属性:

点击(此处)折叠或打开

  1. <Label x:Name="label" />
  2. <Slider Maximum="100"
  3.         Value="{Binding Source={x:Reference label},
  4.                         Path=FontSize}" />

这似乎没有任何意义。 但是,如果你尝试它,它将工作得很好。 再一次,Slider将操纵Label的FontSize属性。
第二个绑定因为称为绑定模式的东西而起作用。
您已经了解到数据绑定从源属性的值设置目标属性的值,但有时数据流不是那么明确。 目标和源之间的关系由BindingMode枚举的成员定义:

  • Default
  • OneWay - 源中的更改会影响目标(正常)。
  • OneWayToSource - 目标中的更改会影响源。
  • TwoWay - 源和目标的变化相互影响。

此BindingMode枚举在两个不同的类中起作用:
使用静态Create或CreateReadOnly静态方法之一创建BindableProperty对象时,可以指定当该属性是数据绑定的目标时要使用的默认BindingMode值。
如果未指定任何内容,则默认绑定模式为OneWay,用于可读写属性的可绑定属性,OneWayToSource用于只读可绑定属性。如果在创建可绑定属性时指定BindingMode.Default,则属性的默认绑定模式将设置为OneWay。 (换句话说,BindingMode.Default成员不用于定义可绑定属性。)
在代码或XAML中定义绑定时,可以覆盖目标属性的默认绑定模式。通过将Binding的Mode属性设置为BindingMode枚举的其中一个成员,可以覆盖默认绑定模式。默认成员意味着您要使用为目标属性定义的默认绑定模式。
将Mode属性设置为OneWayToSource时,您不会切换目标和源。目标仍然是您在其上设置BindingContext的对象以及您调用SetBinding的属性或应用了Binding标记扩展。但是数据流向不同的方向 - 从目标到源。
大多数可绑定属性都具有OneWay的默认绑定模式。但是,也有一些例外。在本书中到目前为止您遇到的视图中,以下属性的默认模式为TwoWay:
Class Property that is TwoWay
Slider Value
Stepper Value
Switch IsToggled
Entry Text
Editor Text
SearchBar Text
DatePicker Date
TimePicker Time
具有默认绑定模式TwoWay的属性是最有可能与MVVM场景中的基础数据模型一起使用的属性。 使用MVVM,绑定目标是可视对象,绑定源是数据对象。 通常,您希望数据以双向流动。 您希望可视对象显示基础数据值(从源到目标),并且您希望交互式可视对象导致基础数据(目标到源)的更改。
BindingModes程序使用“普通”绑定连接四个Label元素和四个Slider元素,这意味着target是Label的FontSize属性,source是Slider的Value属性:


点击(此处)折叠或打开

  1. <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
  2.              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
  3.              x:Class="BindingModes.BindingModesPage"
  4.              Padding="10, 0">
  5.     <ContentPage.Resources>
  6.         <ResourceDictionary>
  7.             <Style TargetType="StackLayout">
  8.                 <Setter Property="VerticalOptions" Value="CenterAndExpand" />
  9.             </Style>
  10.             <Style TargetType="Label">
  11.                 <Setter Property="HorizontalOptions" Value="Center" />
  12.             </Style>
  13.         </ResourceDictionary>
  14.     </ContentPage.Resources>
  15.     <StackLayout VerticalOptions="Fill">
  16.         <StackLayout>
  17.             <Label Text="Default"
  18.                    FontSize="{Binding Source={x:Reference slider1},
  19.                                       Path=Value}" />
  20.             <Slider x:Name="slider1"
  21.                     Maximum="50" />
  22.         </StackLayout>
  23.         <StackLayout>
  24.             <Label Text="OneWay"
  25.                    FontSize="{Binding Source={x:Reference slider2},
  26.                                       Path=Value,
  27.                                       Mode=OneWay}" />
  28.             <Slider x:Name="slider2"
  29.                     Maximum="50" />
  30.         </StackLayout>
  31.         <StackLayout>
  32.             <Label Text="OneWayToSource"
  33.                    FontSize="{Binding Source={x:Reference slider3},
  34.                                       Path=Value,
  35.                                       Mode=OneWayToSource}" />
  36.             <Slider x:Name="slider3"
  37.                     Maximum="50" />
  38.         </StackLayout>
  39.         <StackLayout>
  40.             <Label Text="TwoWay"
  41.                    FontSize="{Binding Source={x:Reference slider4},
  42.                                       Path=Value,
  43.                                       Mode=TwoWay}" />
  44.             <Slider x:Name="slider4"
  45.                     Maximum="50" />
  46.         </StackLayout>
  47.     </StackLayout>
  48. </ContentPage>

标签的文本表示绑定模式。 当您第一次运行此程序时,所有Slider元素都初始化为零,除了第三个,稍微非零:
2018_09_24_183837
通过操作每个Slider,您可以更改Label的FontSize,但它不适用于第三个,因为OneWayToSource模式指示目标中的更改(Label的FontSize属性)影响源(Value属性) 滑块):
2018_09_24_183948
虽然这里不太明显,但默认绑定模式是OneWay,因为绑定是在Label的FontSize属性上设置的,这是FontSize属性的默认绑定模式。
ReverseBinding程序在Slider的Value属性上设置绑定:

点击(此处)折叠或打开

  1. <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
  2.              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
  3.              x:Class="ReverseBinding.ReverseBindingPage"
  4.              Padding="10, 0">
  5.     <ContentPage.Resources>
  6.         <ResourceDictionary>
  7.             <Style TargetType="StackLayout">
  8.                 <Setter Property="VerticalOptions" Value="CenterAndExpand" />
  9.             </Style>
  10.             <Style TargetType="Label">
  11.                 <Setter Property="HorizontalOptions" Value="Center" />
  12.             </Style>
  13.         </ResourceDictionary>
  14.     </ContentPage.Resources>
  15.     <StackLayout VerticalOptions="Fill">
  16.         <StackLayout>
  17.             <Label x:Name="label1"
  18.                    Text="Default" />
  19.             <Slider Maximum="50"
  20.                     Value="{Binding Source={x:Reference label1},
  21.                                     Path=FontSize}" />
  22.         </StackLayout>
  23.         <StackLayout>
  24.             <Label x:Name="label2"
  25.                    Text="OneWay" />
  26.             <Slider Maximum="50"
  27.                     Value="{Binding Source={x:Reference label2},
  28.                                     Path=FontSize,
  29.                                     Mode=OneWay}" />
  30.         </StackLayout>
  31.         <StackLayout>
  32.             <Label x:Name="label3"
  33.                    Text="OneWayToSource" />
  34.             <Slider Maximum="50"
  35.                     Value="{Binding Source={x:Reference label3},
  36.                                     Path=FontSize,
  37.                                     Mode=OneWayToSource}" />
  38.         </StackLayout>
  39.         <StackLayout>
  40.             <Label x:Name="label4"
  41.                    Text="TwoWay" />
  42.             <Slider Maximum="50"
  43.                     Value="{Binding Source={x:Reference label4},
  44.                                     Path=FontSize,
  45.                                     Mode=TwoWay}" />
  46.         </StackLayout>
  47.     </StackLayout>
  48. </ContentPage>

这些绑定的默认绑定模式是TwoWay,因为这是在Slider的Value属性的BindableProperty.Create方法中设置的模式。
这种方法的有趣之处在于,对于这里的三种情况,Slider的Value属性是从Label的FontSize属性初始化的:
2018_09_24_184918
OneWayToSource不会发生这种情况,因为对于该模式,对Slider的Value属性的更改会影响Label的FontSize属性,但不会影响其他方式。
现在让我们开始操作这些滑块:
2018_09_24_185000
现在,OneWayToSource绑定有效,因为对Slider的Value属性的更改会影响Label的FontSize属性,但是OneWay绑定不起作用,因为这表明Slider的Value属性仅受到FontSize属性的更改的影响。 标签。
哪种装订效果最好? 哪个绑定将Slider的Value属性初始化为Label的FontSize属性,还允许Slider操作更改FontSize? 它是Slider上的反向绑定设置,具有TwoWay模式,这是默认模式。
这正是Slider绑定到某些数据时要查看的初始化类型。 因此,当使用带有MVVM的Slider时,在Slider上设置绑定以显示数据值并操纵数据值。

阅读(133) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~