Udostępnij za pośrednictwem


Tryb wiązania

Browse sample. Przeglądanie przykładu

Każda właściwość powiązana interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) ma domyślny tryb powiązania ustawiony podczas tworzenia właściwości możliwej do powiązania, która jest dostępna we DefaultBindingMode właściwości BindableProperty obiektu. Ten domyślny tryb powiązania wskazuje tryb obowiązujący, gdy ta właściwość jest obiektem docelowym powiązania danych. Domyślny tryb powiązania dla większości właściwości, takich jak Rotation, Scalei Opacity to OneWay. Gdy te właściwości są obiektami docelowymi powiązania danych, właściwość docelowa jest ustawiana ze źródła.

W poniższym przykładzie pokazano powiązanie danych zdefiniowane na obiekcie Slider:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DataBindingDemos.ReverseBindingPage"
             Title="Reverse Binding">
    <StackLayout Padding="10, 0">
        <Label x:Name="label"
               Text="TEXT"
               FontSize="80"
               HorizontalOptions="Center"
               VerticalOptions="Center" />
        <Slider x:Name="slider"
                VerticalOptions="Center"
                Value="{Binding Source={x:Reference label},
                                Path=Opacity}" />
    </StackLayout>
</ContentPage>

W tym przykładzie Label element jest źródłem powiązania danych, a Slider elementem docelowym. Powiązanie odwołuje się do Opacity właściwości Label, która ma wartość domyślną 1. W związku z tym parametr Slider jest inicjowany do wartości 1 z początkowej Opacity Labelwartości . Jest to pokazane na poniższym zrzucie ekranu:

Reverse binding.

Ponadto Slider nadal działają. Jest to spowodowane tym, że domyślnym trybem powiązania dla Value właściwości elementu Slider jest TwoWay. Oznacza to, że gdy Value właściwość jest obiektem docelowym powiązania danych, element docelowy jest ustawiany ze źródła, ale źródło jest również ustawione z obiektu docelowego. Slider Umożliwia to ustawienie wartości początkowejOpacity.

Uwaga

Właściwości możliwe do powiązania nie sygnalizują zmiany właściwości, chyba że właściwość rzeczywiście ulegnie zmianie. Zapobiega to nieskończonej pętli.

Jeśli domyślny tryb powiązania we właściwości docelowej nie jest odpowiedni dla określonego powiązania danych, można go zastąpić, ustawiając Mode właściwość (lub Mode właściwość Binding Binding rozszerzenia znaczników) na jeden z elementów członkowskich BindingMode wyliczenia:

  • Default
  • TwoWay — dane idą w obie strony między źródłem a obiektem docelowym
  • OneWay — dane przechodzą ze źródła do miejsca docelowego
  • OneWayToSource — dane przechodzą z miejsca docelowego do źródła
  • OneTime — dane przechodzą ze źródła do miejsca docelowego, ale tylko wtedy, gdy BindingContext zmiany

Powiązania dwukierunkowe

Większość właściwości możliwych do powiązania ma domyślny tryb powiązania, ale niektóre właściwości mają domyślny tryb OneWay TwoWaypowiązania , w tym następujące:

Te właściwości są definiowane jako TwoWay , ponieważ gdy powiązania danych są używane ze wzorcem Model-View-ViewModel (MVVM), klasa viewmodel jest źródłem powiązania danych, a widok, który składa się z widoków, takich jak Slider, są obiektami docelowymi powiązania danych. Powiązania MVVM przypominają powyższy przykład, ponieważ prawdopodobnie każdy widok na stronie ma zostać zainicjowany z wartością odpowiedniej właściwości w modelu viewmodel, ale zmiany w widoku również powinny mieć wpływ na właściwość viewmodel.

Powiązania jednokierunkowe do źródła

Właściwości możliwe do powiązania tylko do odczytu mają domyślny tryb OneWayToSourcepowiązania . Na przykład właściwość obiektu SelectedItem ListView ma domyślny tryb OneWayToSourcepowiązania . Dzieje się tak, ponieważ powiązanie właściwości SelectedItem powinno spowodować ustawienie źródła powiązania.

Powiązania jednorazowe

Właściwości docelowe z trybem OneTime powiązania są aktualizowane tylko wtedy, gdy kontekst powiązania ulegnie zmianie. W przypadku powiązań dla tych właściwości docelowych upraszcza to infrastrukturę powiązania, ponieważ nie jest konieczne monitorowanie zmian we właściwościach źródłowych.

Kilka właściwości ma domyślny tryb OneTimepowiązania , w tym IsTextPredictionEnabled właściwość Entry.

Wyświetlanie modelu i powiadomień o zmianie właściwości

W przypadku korzystania z modelu viewmodel w powiązaniu danych model viewmodel jest źródłem powiązania danych. Model widoku nie definiuje właściwości możliwych do powiązania, ale implementuje mechanizm powiadomień, który umożliwia powiadamianie infrastruktury powiązania o zmianie wartości właściwości. Ten mechanizm powiadomień jest interfejsem INotifyPropertyChanged , który definiuje jedno zdarzenie o nazwie PropertyChanged. Klasa, która implementuje ten interfejs, zwykle uruchamia zdarzenie, gdy jedna z jego właściwości publicznych zmienia wartość. Zdarzenie nie musi być zgłaszane, jeśli właściwość nigdy się nie zmienia. Interfejs INotifyPropertyChanged jest również implementowany przez BindableObject program i PropertyChanged zdarzenie jest wywoływane za każdym razem, gdy wartość właściwości możliwej do powiązania zmienia się.

W poniższym przykładzie powiązania danych umożliwiają wybranie koloru przy użyciu trzech Slider elementów odcienia, nasycenia i jasności:

public class HslColorViewModel : INotifyPropertyChanged
{
    Color color;
    string name;
    float hue;
    float saturation;
    float luminosity;

    public event PropertyChangedEventHandler PropertyChanged;

    public float Hue
    {
        get
        {
            return hue;
        }
        set
        {
            if (hue != value)
            {
                Color = Color.FromHsla(value, saturation, luminosity);
            }
        }
    }

    public float Saturation
    {
        get
        {
            return saturation;
        }
        set
        {
            if (saturation != value)
            {
                Color = Color.FromHsla(hue, value, luminosity);
            }
        }        
    }

    public float Luminosity
    {
        get
        {
            return luminosity;
        }
        set
        {
            if (luminosity != value)
            {
                Color = Color.FromHsla(hue, saturation, value);
            }
        }
    }

    public Color Color
    {
        get
        {
            return color;
        }
        set
        {
            if (color != value)
            {
                color = value;
                hue = color.GetHue();
                saturation = color.GetSaturation();
                luminosity = color.GetLuminosity();
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Hue"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Saturation"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Luminosity"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Color"));

                Name = NamedColor.GetNearestColorName(color);
            }
        }
    }

    public string Name
    {
        get
        {
            return name;
        }
        private set
        {
            if (name != value)
            {
                name = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }
}

W tym przykładzie HslColorViewModel klasa definiuje Huewłaściwości , Saturation, Luminosity, Colori Name . Gdy dowolny z trzech składników kolorów zmienia wartość, Color właściwość jest obliczana ponownie, a PropertyChanged zdarzenia są wywoływane dla wszystkich czterech właściwości. Color Gdy właściwość ulegnie zmianie, metoda statyczna GetNearestColorName w NamedColor klasie uzyskuje najbliższy nazwany kolor i ustawia Name właściwość .

Gdy model widoku jest ustawiony jako źródło powiązania, infrastruktura powiązania dołącza procedurę obsługi do zdarzenia PropertyChanged . W ten sposób powiązanie może zostać powiadomione o zmianach właściwości, a następnie ustawić właściwości docelowe ze zmienionych wartości. Jednak jeśli właściwość docelowa (lub Binding definicja we właściwości docelowej) ma BindingMode OneTimewartość , nie jest konieczne, aby infrastruktura powiązania dołączała program obsługi w PropertyChanged zdarzeniu. Właściwość docelowa jest aktualizowana tylko wtedy, gdy BindingContext zmienia się, a nie wtedy, gdy sama właściwość źródłowa ulegnie zmianie.

Poniższy kod XAML korzysta z elementu HslColorViewModel:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="DataBindingDemos.SimpleColorSelectorPage">
    <ContentPage.BindingContext>
        <local:HslColorViewModel Color="MediumTurquoise" />
    </ContentPage.BindingContext>

    <ContentPage.Resources>
        <Style TargetType="Slider">
            <Setter Property="VerticalOptions" Value="CenterAndExpand" />
        </Style>
    </ContentPage.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <BoxView Color="{Binding Color}"
                 Grid.Row="0" />
        <StackLayout Grid.Row="1"
                     Margin="10, 0">
            <Label Text="{Binding Name}"
                   HorizontalTextAlignment="Center" />
            <Slider Value="{Binding Hue}" />
            <Slider Value="{Binding Saturation}" />
            <Slider Value="{Binding Luminosity}" />
        </StackLayout>
    </Grid>
</ContentPage>

W tym przykładzie element HslColorViewModel jest tworzone wystąpienie, a Color właściwość ustawiana jako BindingContextelement . Widoki BoxView, Labeli trzy Slider dziedziczą kontekst powiązania z klasy ContentPage. Te widoki to wszystkie obiekty docelowe powiązania odwołujące się do właściwości źródła w modelu widoku. Color Dla właściwości BoxView, i Text właściwości Label, powiązania danych to OneWay — właściwości w widoku są ustawione z właściwości w modelu viewmodel. SliderWłaściwość Value , jednak używa TwoWay trybu powiązania. Dzięki temu każda Slider z nich może być ustawiona na podstawie modelu widoku, a także, aby model widoku był ustawiany z każdego Sliderelementu .

Po pierwszym uruchomieniu przykładu BoxViewwszystkie elementy , Labeli trzy Slider elementy są ustawiane z modelu viewmodel na podstawie początkowej Color właściwości ustawionej podczas tworzenia wystąpienia modelu viewmodel:

Simple color selector.

W miarę manipulowania suwakami kontrolki BoxView i Label są odpowiednio aktualizowane.

Zastępowanie trybu powiązania

Tryb powiązania dla właściwości docelowej można zastąpić, ustawiając Mode właściwość Binding (lub Mode właściwość Binding rozszerzenia znaczników) na jeden z elementów BindingMode członkowskich wyliczenia.

Jednak ustawienie Mode właściwości nie zawsze generuje oczekiwany wynik. Na przykład w poniższym przykładzie ustawienie Mode właściwości TwoWay na wartość nie działa zgodnie z oczekiwaniami:

<Label Text="TEXT"
       FontSize="40"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand"
       Scale="{Binding Source={x:Reference slider},
                       Path=Value,
                       Mode=TwoWay}" />

W tym przykładzie można się spodziewać, że Slider właściwość zostanie zainicjowana do początkowej Scale wartości właściwości, która wynosi 1, ale tak się nie stanie. TwoWay Po zainicjowaniu powiązania element docelowy jest ustawiany z pierwszego źródła, co oznacza, że Scale właściwość jest ustawiona na wartość domyślną Slider 0. TwoWay Gdy powiązanie jest ustawione na Sliderobiekcie , Slider element jest początkowo ustawiany ze źródła.

Alternatywnie można ustawić tryb powiązania na OneWayToSource:

<Label Text="TEXT"
       FontSize="40"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand"
       Scale="{Binding Source={x:Reference slider},
                       Path=Value,
                       Mode=OneWayToSource}" />

Teraz parametr Slider jest inicjowany na 1 (wartość Scaledomyślna ) ale manipulowanie właściwością Slider nie ma wpływu na Scale właściwość .

Uwaga

Klasa VisualElement definiuje również właściwości ScaleX i ScaleY, które umożliwiają skalowanie klasy VisualElement w różny sposób poziomo i pionowo.

Bardzo przydatna aplikacja przesłaniania domyślnego trybu powiązania z trybem TwoWay powiązania obejmuje SelectedItem właściwość ListView. Domyślnym trybem powiązania jest OneWayToSource. Gdy powiązanie danych jest ustawione na SelectedItem właściwości w celu odwołania się do właściwości źródłowej w modelu viewmodel, właściwość źródłowa jest ustawiana z zaznaczenia ListView . Jednak w niektórych okolicznościach można również zainicjować element ListView z modelu widoków.

Ważne

Domyślny tryb powiązania może się różnić od kontrolki do kontrolki i jest ustawiany po utworzeniu właściwości możliwej do powiązania. Jest on dostępny we DefaultBindingMode właściwości BindableProperty obiektu.