Podsumowanie rozdziału 16. Powiązanie danych
Uwaga
Ta książka została opublikowana wiosną 2016 roku i od tego czasu nie została zaktualizowana. Jest wiele w książce, która pozostaje cenna, ale niektóre materiały są nieaktualne, a niektóre tematy nie są już całkowicie poprawne ani kompletne.
Programiści często piszą programy obsługi zdarzeń, które wykrywają, kiedy właściwość jednego obiektu uległa zmianie, i używają jej do zmiany wartości właściwości w innym obiekcie. Ten proces można zautomatyzować za pomocą techniki powiązania danych. Powiązania danych są zwykle definiowane w języku XAML i stają się częścią definicji interfejsu użytkownika.
Bardzo często te powiązania danych łączą obiekty interfejsu użytkownika z podstawowymi danymi. Jest to technika, która jest badana bardziej w rozdziale 18. MVVM. Jednak powiązania danych mogą również łączyć co najmniej dwa elementy interfejsu użytkownika. Większość wczesnych przykładów powiązania danych w tym rozdziale pokazuje tę technikę.
Podstawy powiązań
W powiązaniu danych bierze udział kilka właściwości, metod i klas:
- Klasa
Binding
pochodzi zBindingBase
i hermetyzuje wiele cech powiązania danych - Właściwość
BindingContext
jest definiowana przez klasęBindableObject
- Metoda
SetBinding
jest również definiowana przez klasęBindableObject
- Klasa
BindableObjectExtensions
definiuje trzy dodatkoweSetBinding
metody
Następujące dwie klasy obsługują rozszerzenia znaczników XAML dla powiązań:
BindingExtension
Binding
obsługuje rozszerzenie znacznikówReferenceExtension
x:Reference
obsługuje rozszerzenie znaczników
Dwa interfejsy są związane z powiązaniem danych:
INotifyPropertyChanged
System.ComponentModel
w przestrzeni nazw służy do implementowania powiadomienia w przypadku zmiany właściwościIValueConverter
służy do definiowania małych klas, które konwertują wartości z jednego typu na inny w powiązaniach danych
Powiązanie danych łączy dwie właściwości tego samego obiektu lub (częściej) dwa różne obiekty. Te dwie właściwości są określane jako źródło i element docelowy. Ogólnie rzecz biorąc, zmiana właściwości źródłowej powoduje zmianę w właściwości docelowej, ale czasami kierunek jest odwrócony. Niezależnie:
- właściwość docelowa musi być wspierana przez element
BindableProperty
- właściwość źródłowa jest zazwyczaj elementem członkowskim klasy, która implementuje
INotifyPropertyChanged
Klasa, która implementuje INotifyPropertyChanged
wyzwala PropertyChanged
zdarzenie, gdy właściwość zmienia wartość. BindableObject
implementuje INotifyPropertyChanged
i automatycznie uruchamia PropertyChanged
zdarzenie, gdy właściwość wspierana BindableProperty
przez wartości zmian, ale można napisać własne klasy, które implementują INotifyPropertyChanged
bez wyprowadzania z BindableObject
klasy .
Kod i XAML
Przykład OpacityBindingCode pokazuje, jak ustawić powiązanie danych w kodzie:
- Źródło jest właściwością
Value
obiektuSlider
- Element docelowy jest właściwością
Opacity
obiektuLabel
Dwa obiekty są połączone przez ustawienie BindingContext
Label
obiektu na Slider
obiekt. Dwie właściwości są połączone przez wywołanie SetBinding
metody rozszerzenia w Label
odwołaniu OpacityProperty
do właściwości możliwej do powiązania i Value
właściwości Slider
wyrażonej jako ciąg.
Manipulowanie następnie Slider
powoduje Label
zanikanie i poza widokiem.
Plik OpacityBindingXaml jest tym samym programem z zestawem powiązań danych w języku XAML. Właściwość BindingContext
elementu Label
jest ustawiona na x:Reference
rozszerzenie znaczników odwołujące Slider
się do właściwości , a Opacity
właściwość Label
obiektu jest ustawiona na rozszerzenie znaczników z jej Path
właściwością odwołującą Value
się do Binding
właściwości Slider
.
Źródło i powiązanieContext
Przykład BindingSourceCode przedstawia alternatywne podejście w kodzie. Obiekt Binding
jest tworzony przez ustawienie Source
właściwości Slider
na obiekt i Path
właściwość na wartość "Value". SetBinding
Metoda BindableObject
metody jest następnie wywoływana Label
w obiekcie .
Konstruktor Binding
mógł również służyć do definiowania Binding
obiektu.
Przykład BindingSourceXaml przedstawia porównywalną technikę w języku XAML. Właściwość Opacity
Label
obiektu jest ustawiona na rozszerzenie znaczników z Path
ustawioną Value
właściwością Binding
i Source
ustawioną na osadzone x:Reference
rozszerzenie znaczników.
Podsumowując, istnieją dwa sposoby odwołowania się do obiektu źródłowego powiązania:
BindingContext
Za pośrednictwem właściwości obiektu docelowegoSource
Za pośrednictwem właściwościBinding
samego obiektu
Jeśli oba są określone, drugi ma pierwszeństwo. Zaletą BindingContext
tej funkcji jest propagacja jej za pomocą drzewa wizualnego. Jest to bardzo przydatne, jeśli wiele właściwości docelowych jest powiązanych z tym samym obiektem źródłowym.
Program WebViewDemo demonstruje tę technikę za WebView
pomocą elementu . Dwa Button
elementy nawigowania do tyłu i do przodu dziedziczą element po elemencie nadrzędnym BindingContext
, który odwołuje się do elementu WebView
. IsEnabled
Właściwości dwóch przycisków mają następnie proste Binding
rozszerzenia znaczników, które są przeznaczone dla właściwości przycisku IsEnabled
na podstawie ustawień CanGoBack
właściwości i CanGoForward
tylko do odczytu obiektu WebView
.
Tryb powiązania
Mode
Ustaw właściwość elementu Binding
na element członkowski BindingMode
wyliczenia:
OneWay
aby zmiany właściwości źródłowej wpływały na element docelowyOneWayToSource
tak, aby zmiany we właściwości docelowej wpływały na źródłoTwoWay
aby zmiany w źródle i miejscu docelowym wpływały na siebie nawzajemDefault
aby użyć określonegoDefaultBindingMode
momentu utworzenia obiektu docelowegoBindableProperty
. Jeśli żadna z nich nie została określona, wartość domyślna dotyczyOneWay
normalnych właściwości możliwych do powiązania iOneWayToSource
właściwości tylko do odczytu.
Uwaga
Wyliczenie BindingMode
obejmuje OnTime
teraz również zastosowanie powiązania tylko wtedy, gdy kontekst powiązania ulegnie zmianie, a nie wtedy, gdy właściwość źródłowa ulegnie zmianie.
Właściwości, które mogą być obiektami docelowymi powiązań danych w scenariuszach MVVM, zazwyczaj mają DefaultBindingMode
wartość TwoWay
. Są to:
Value
właściwość iSlider
Stepper
IsToggled
właściwośćSwitch
Text
Entry
właściwość ,Editor
iSearchBar
Date
właściwośćDatePicker
Time
właściwośćTimePicker
Przykład BindingModes demonstruje cztery tryby powiązania z powiązaniem danych, w którym element docelowy jest FontSize
właściwością elementu , Label
a źródło jest Value
właściwością Slider
. Dzięki temu każda z nich Slider
może kontrolować rozmiar czcionki odpowiedniego Label
elementu . Slider
Ale elementy nie są inicjowane, ponieważ DefaultBindingMode
FontSize
właściwość ma wartość OneWay
.
Przykład ReverseBinding ustawia powiązania we Value
właściwości odwołującej się do FontSize
właściwości Slider
każdego Label
elementu . Wydaje się to być do tyłu, ale działa lepiej w inicjowaniu Slider
elementów, ponieważ Value
właściwość obiektu Slider
ma DefaultBindingMode
wartość TwoWay
.
Jest to analogiczne do sposobu, w jaki powiązania są definiowane w maszynie MVVM, a ten typ powiązania jest często używany.
Formatowanie ciągu
Gdy właściwość docelowa jest typu string
, można użyć właściwości zdefiniowanej StringFormat
przez BindingBase
w celu przekonwertowania źródła na string
. StringFormat
Ustaw właściwość na ciąg formatowania platformy .NET, który ma być używany z formatem statycznymString.Format
, aby wyświetlić obiekt. W przypadku korzystania z tego ciągu formatowania w rozszerzeniu znaczników umieść go za pomocą pojedynczych cudzysłowów, aby nawiasy klamrowe nie myliły się z osadzonym rozszerzeniem znaczników.
W przykładzie ShowViewValues pokazano, jak używać StringFormat
w języku XAML.
W przykładzie WhatSizeBindings pokazano rozmiar strony z powiązaniami z Width
właściwościami i Height
obiektu ContentPage
.
Dlaczego nazywa się "Ścieżka"?
Właściwość Path
Binding
elementu jest tak zwana, ponieważ może być serią właściwości i indeksatorów oddzielonych kropkami. Przykład BindingPathDemos przedstawia kilka przykładów.
Konwertery wartości powiązania
Gdy właściwości źródłowe i docelowe powiązania są różne typy, można konwertować między typami przy użyciu konwertera powiązań. Jest to klasa, która implementuje IValueConverter
interfejs i zawiera dwie metody: Convert
przekonwertować źródło na obiekt docelowy i ConvertBack
przekonwertować obiekt docelowy na źródło.
Klasa IntToBoolConverter
w bibliotece Xamarin.FormsBook.Toolkit jest przykładem konwertowania elementu int
na .bool
Jest to pokazane przez przykład ButtonEnabler , który włącza Button
tylko, jeśli co najmniej jeden znak został wpisany w Entry
.
Klasa BoolToStringConverter
konwertuje element bool
na element string
i definiuje dwie właściwości, aby określić, jaki tekst ma być zwracany dla false
wartości i true
.
Element BoolToColorConverter
jest podobny. Przykład SwitchText demonstruje użycie tych dwóch konwerterów do wyświetlania różnych tekstów w różnych kolorach na Switch
podstawie ustawienia.
Rodzajowy BoolToObjectConverter
może zastąpić BoolToStringConverter
i BoolToColorConverter
służyć jako uogólniony bool
konwerter -to-object dowolnego typu.
Powiązania i widoki niestandardowe
Kontrolki niestandardowe można uprościć przy użyciu powiązań danych. Plik NewCheckBox.cs
kodu definiuje Text
właściwości , , FontSize
TextColor
, FontAttributes
i IsChecked
, ale w ogóle nie ma logiki dla wizualizacji kontrolki.
NewCheckBox.cs.xaml
Zamiast tego plik zawiera wszystkie znaczniki dla wizualizacji kontrolki za pośrednictwem powiązań danych na Label
podstawie właściwości zdefiniowanych w pliku za pomocą kodu.
Przykład NewCheckBoxDemo demonstruje kontrolkę niestandardową NewCheckBox
.