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
:
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 BindableObject
klasy , ż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 Element
metodę 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 BindableProperty
typu 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 CLRdeclaringType
: 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 double
wartość , 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ścipropertyChanging
: wywołanie zwrotne wskazujące, kiedy właściwość ma ulec zmianiecoerceValue
: 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 .