第十六章:数据绑定(四)

绑定模式

这是一个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上设置绑定以显示数据值并操纵数据值。

上一篇:C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0


下一篇:电子发票+SaaS服务,票加加为企业提供票税智能管理解决方案