Udostępnij za pośrednictwem


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:

Następujące dwie klasy obsługują rozszerzenia znaczników XAML dla powiązań:

Dwa interfejsy są związane z powiązaniem danych:

  • INotifyPropertyChangedSystem.ComponentModel w przestrzeni nazw służy do implementowania powiadomienia w przypadku zmiany właściwości
  • IValueConverter 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 elementBindableProperty
  • właściwość źródłowa jest zazwyczaj elementem członkowskim klasy, która implementujeINotifyPropertyChanged

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 BindableObjectklasy .

Kod i XAML

Przykład OpacityBindingCode pokazuje, jak ustawić powiązanie danych w kodzie:

  • Źródło jest właściwością Value obiektu Slider
  • Element docelowy jest właściwością Opacity obiektu Label

Dwa obiekty są połączone przez ustawienie BindingContextLabel 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 Slidersię 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ść OpacityLabel 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 docelowego
  • Source Za pośrednictwem właściwości Binding 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 docelowy
  • OneWayToSource tak, aby zmiany we właściwości docelowej wpływały na źródło
  • TwoWay aby zmiany w źródle i miejscu docelowym wpływały na siebie nawzajem
  • Default aby użyć określonego DefaultBindingMode momentu utworzenia obiektu docelowego BindableProperty . Jeśli żadna z nich nie została określona, wartość domyślna dotyczy OneWay normalnych właściwości możliwych do powiązania i OneWayToSource 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:

  • Valuewłaściwość i SliderStepper
  • IsToggled właściwość Switch
  • TextEntrywłaściwość , EditoriSearchBar
  • 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 Labelelementu . Slider Ale elementy nie są inicjowane, ponieważ DefaultBindingModeFontSize 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 Labelelementu . 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.

Potrójny zrzut ekranu przedstawiający powiązanie odwrotne

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ść PathBinding 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 boolkonwerter -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 Textwłaściwości , , FontSizeTextColor, FontAttributesi 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 .