Udostępnij za pośrednictwem


Podsumowanie rozdziału 11. Powiązana infrastruktura

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.

Każdy programista języka C# zna właściwości języka C#. Właściwości zawierają zestaw metod dostępu i/lub uzyskać metodę dostępu. Są one często nazywane właściwościami CLR środowiska uruchomieniowego języka wspólnego.

Xamarin.Forms definiuje rozszerzoną definicję właściwości o nazwie powiązaną właściwość hermetyzowaną przez BindableProperty klasę i obsługiwaną przez klasę BindableObject . Te klasy są powiązane, ale zupełnie odrębne: BindableProperty służy do definiowania samej właściwości; BindableObject jest jak object w tym, że jest klasą bazową dla klas definiujących właściwości możliwe do powiązania.

Xamarin.Forms Hierarchia klas

Przykład ClassHierarchy używa odbicia w celu wyświetlenia hierarchii Xamarin.Forms klas i zademonstrowania kluczowej roli odgrywanej BindableObject przez tę hierarchię. BindableObject pochodzi z Object klasy i jest klasą nadrzędną, z Element której VisualElement pochodzą. Jest to klasa nadrzędna do Page i View, która jest klasą nadrzędną do Layout:

Zrzut ekranu przedstawiający udostępnianie hierarchii klas

Wgląd w bindableObject i BindableProperty

W klasach, które pochodzą z BindableObject wielu właściwości CLR, mówi się, że są "wspierane przez" powiązane właściwości. Na przykład Text właściwość Label klasy jest właściwością CLR, ale Label klasa definiuje również publiczne statyczne pole tylko do odczytu o nazwie TextProperty typu BindableProperty.

Aplikacja może ustawić lub pobrać Text właściwość Label normalnie albo aplikację można ustawić Text , wywołując SetValue metodę zdefiniowaną za pomocą BindableObject argumentu Label.TextProperty . Podobnie aplikacja może uzyskać wartość Text właściwości, wywołując GetValue metodę ponownie z argumentem Label.TextProperty . Jest to pokazane przez przykład PropertySettings.

Text W rzeczywistości właściwość CLR jest całkowicie implementowana przy użyciu SetValue metod i GetValue zdefiniowanych BindableObject w połączeniu z właściwością statycznąLabel.TextProperty.

BindableObject i BindableProperty zapewniają pomoc techniczną dla:

  • Nadawanie właściwości wartości domyślnych
  • Przechowywanie bieżących wartości
  • Zapewnianie mechanizmów sprawdzania poprawności wartości właściwości
  • Utrzymywanie spójności między powiązanymi właściwościami w jednej klasie
  • Reagowanie na zmiany właściwości
  • Wyzwalanie powiadomień, gdy właściwość ma ulec zmianie lub została zmieniona
  • Powiązanie danych pomocniczych
  • Style pomocnicze
  • Obsługa zasobów dynamicznych

Za każdym razem, gdy właściwość, która jest wspierana przez właściwość, którą można powiązać, ulega zmianie, BindableObject wyzwala PropertyChanged zdarzenie identyfikujące zmienioną właściwość. To zdarzenie nie jest wyzwalane, gdy właściwość jest ustawiona na tę samą wartość.

Niektóre właściwości nie są wspierane przez właściwości możliwe do powiązania, a niektóre Xamarin.Forms klasy — takie jak Span — nie pochodzą z klasy BindableObject. Tylko klasa pochodząca z BindableObject klasy może obsługiwać właściwości możliwe do powiązania, ponieważ BindableObject definiuje SetValue metody i GetValue .

Ponieważ Span nie pochodzi z BindableObjectklasy , żadna z jej właściwości — na przykład Text — nie jest wspierana przez właściwość, którą można powiązać. DynamicResource Dlatego ustawienie właściwości Text Span właściwości zgłasza wyjątek w przykładzie DynamicVsStatic w poprzednim rozdziale. Przykład DynamicVsStaticCode pokazuje, jak ustawić zasoby dynamiczne w kodzie przy użyciu metody zdefiniowanej przez Elementmetodę SetDynamicResource . Pierwszy argument jest obiektem typu BindableProperty.

Podobnie metoda zdefiniowana SetBinding przez BindableObject element ma pierwszy argument typu BindableProperty.

Definiowanie właściwości możliwych do powiązania

Możesz zdefiniować własne właściwości możliwe do powiązania przy użyciu metody statycznej BindableProperty.Create , aby utworzyć statyczne pole BindablePropertytypu tylko do odczytu.

Jest to pokazane w AltLabel klasie w bibliotece Xamarin.FormsBook.Toolkit . Klasa pochodzi z Label klasy i umożliwia określenie rozmiaru czcionki w punktach. Przedstawiono ją w przykładzie PointSizedText .

Wymagane są cztery argumenty BindableProperty.Create metody:

  • propertyName: nazwa tekstowa właściwości (taka sama jak nazwa właściwości CLR)
  • returnType: typ właściwości CLR
  • declaringType: typ klasy deklarujące właściwość
  • defaultValue: wartość domyślna właściwości

Ponieważ defaultValue jest typu object, kompilator musi mieć możliwość określenia typu wartości domyślnej. Jeśli na przykład returnType parametr ma doublewartość , defaultValue parametr powinien być ustawiony na wartość podobną do 0.0, a nie tylko 0, lub niezgodność typów spowoduje wyzwolenie wyjątku w czasie wykonywania.

Bardzo często zdarza się również, aby właściwość powiązana obejmowała następujące elementy:

  • propertyChanged: metoda statyczna wywoływana, gdy właściwość zmienia wartość. Pierwszym argumentem jest wystąpienie klasy, której właściwość została zmieniona.

Inne argumenty do BindableProperty.Create nie są tak powszechne:

  • defaultBindingMode: używany w połączeniu z powiązaniem danych (zgodnie z opisem w rozdziale 16. Powiązanie danych)
  • validateValue: wywołanie zwrotne w celu sprawdzenia prawidłowej wartości
  • propertyChanging: wywołanie zwrotne wskazujące, kiedy właściwość ma ulec zmianie
  • coerceValue: wywołanie zwrotne do coerce wartości ustawionej na inną wartość
  • defaultValueCreate: wywołanie zwrotne w celu utworzenia wartości domyślnej, której nie można udostępniać między wystąpieniami klasy (na przykład kolekcji)

Właściwość powiązana tylko do odczytu

Właściwość, która można powiązać, może być tylko do odczytu. Utworzenie właściwości możliwej tylko do odczytu wymaga wywołania metody BindableProperty.CreateReadOnly statycznej w celu zdefiniowania prywatnego pola tylko do odczytu typu BindablePropertyKey.

Następnie zdefiniuj właściwość set CLR jako private wywołanie SetValue przeciążenia z obiektem BindablePropertyKey . Uniemożliwia to ustawienie właściwości poza klasą.

Jest to pokazane w klasie używanej CountedLabel w przykładzie BaskervillesCount .