绑定模式
这是一个Label,其FontSize属性绑定到Slider的Value属性:
<Label FontSize="{Binding Source={x:Reference slider},
Path=Value}" />
<Slider x:Name="slider"
Maximum="100" />
这应该工作,如果你尝试,它会工作。 您可以通过操纵Slider来更改Label的FontSize。
但这里是一个标签和滑块与绑定相反。 而不是作为目标的Label的FontSize属性,现在FontSize是数据绑定的源,目标是Slider的Value属性:
<Label x:Name="label" />
<Slider Maximum="100"
Value="{Binding Source={x:Reference label},
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属性:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="BindingModes.BindingModesPage"
Padding="10, 0">
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="StackLayout">
<Setter Property="VerticalOptions" Value="CenterAndExpand" />
</Style>
<Style TargetType="Label">
<Setter Property="HorizontalOptions" Value="Center" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<StackLayout VerticalOptions="Fill">
<StackLayout>
<Label Text="Default"
FontSize="{Binding Source={x:Reference slider1},
Path=Value}" />
<Slider x:Name="slider1"
Maximum="50" />
</StackLayout>
<StackLayout>
<Label Text="OneWay"
FontSize="{Binding Source={x:Reference slider2},
Path=Value,
Mode=OneWay}" />
<Slider x:Name="slider2"
Maximum="50" />
</StackLayout>
<StackLayout>
<Label Text="OneWayToSource"
FontSize="{Binding Source={x:Reference slider3},
Path=Value,
Mode=OneWayToSource}" />
<Slider x:Name="slider3"
Maximum="50" />
</StackLayout>
<StackLayout>
<Label Text="TwoWay"
FontSize="{Binding Source={x:Reference slider4},
Path=Value,
Mode=TwoWay}" />
<Slider x:Name="slider4"
Maximum="50" />
</StackLayout>
</StackLayout>
</ContentPage>
标签的文本表示绑定模式。 当您第一次运行此程序时,所有Slider元素都初始化为零,除了第三个,稍微非零:
通过操作每个Slider,您可以更改Label的FontSize,但它不适用于第三个,因为OneWayToSource模式指示目标中的更改(Label的FontSize属性)影响源(Value属性) 滑块):
虽然这里不太明显,但默认绑定模式是OneWay,因为绑定是在Label的FontSize属性上设置的,这是FontSize属性的默认绑定模式。
ReverseBinding程序在Slider的Value属性上设置绑定:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ReverseBinding.ReverseBindingPage"
Padding="10, 0">
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="StackLayout">
<Setter Property="VerticalOptions" Value="CenterAndExpand" />
</Style>
<Style TargetType="Label">
<Setter Property="HorizontalOptions" Value="Center" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<StackLayout VerticalOptions="Fill">
<StackLayout>
<Label x:Name="label1"
Text="Default" />
<Slider Maximum="50"
Value="{Binding Source={x:Reference label1},
Path=FontSize}" />
</StackLayout>
<StackLayout>
<Label x:Name="label2"
Text="OneWay" />
<Slider Maximum="50"
Value="{Binding Source={x:Reference label2},
Path=FontSize,
Mode=OneWay}" />
</StackLayout>
<StackLayout>
<Label x:Name="label3"
Text="OneWayToSource" />
<Slider Maximum="50"
Value="{Binding Source={x:Reference label3},
Path=FontSize,
Mode=OneWayToSource}" />
</StackLayout>
<StackLayout>
<Label x:Name="label4"
Text="TwoWay" />
<Slider Maximum="50"
Value="{Binding Source={x:Reference label4},
Path=FontSize,
Mode=TwoWay}" />
</StackLayout>
</StackLayout>
</ContentPage>
这些绑定的默认绑定模式是TwoWay,因为这是在Slider的Value属性的BindableProperty.Create方法中设置的模式。
这种方法的有趣之处在于,对于这里的三种情况,Slider的Value属性是从Label的FontSize属性初始化的:
OneWayToSource不会发生这种情况,因为对于该模式,对Slider的Value属性的更改会影响Label的FontSize属性,但不会影响其他方式。
现在让我们开始操作这些滑块:
现在,OneWayToSource绑定有效,因为对Slider的Value属性的更改会影响Label的FontSize属性,但是OneWay绑定不起作用,因为这表明Slider的Value属性仅受到FontSize属性的更改的影响。 标签。
哪种装订效果最好? 哪个绑定将Slider的Value属性初始化为Label的FontSize属性,还允许Slider操作更改FontSize? 它是Slider上的反向绑定设置,具有TwoWay模式,这是默认模式。
这正是Slider绑定到某些数据时要查看的初始化类型。 因此,当使用带有MVVM的Slider时,在Slider上设置绑定以显示数据值并操纵数据值。