Zusammenfassung von Kapitel 11. Die bindbare Infrastruktur
Hinweis
Dieses Buch wurde im Frühjahr 2016 veröffentlicht und seitdem nicht aktualisiert. Wenngleich ein großer Teil des Buchs weiterhin relevante Informationen liefert, sind einige Abschnitte veraltet, und einige Themen sind nicht mehr korrekt oder vollständig.
Jeder C#-Programmierer ist mit den Eigenschaften von C# vertraut. Eigenschaften enthalten einen set-Accessor und/oder einen get-Accessor. Im Kontext der Common Language Runtime werden sie häufig als CLR-Eigenschaften bezeichnet.
In Xamarin.Forms ist eine erweiterte Eigenschaft definiert, die als bindbare Eigenschaft bezeichnet wird. Sie wird von der Klasse BindableProperty
gekapselt und von der Klasse BindableObject
unterstützt. Diese Klassen sind miteinander verknüpft, aber ganz anders: Die BindableProperty
Wird verwendet, um die Eigenschaft selbst zu definieren; BindableObject
ist so object
, als ob es sich um eine Basisklasse für Klassen handelt, die bindungsfähige Eigenschaften definieren.
Xamarin.Forms-Klassenhierarchie
Im ClassHierarchy-Beispiel wird mithilfe einer Reflexion eine Xamarin.Forms-Klassenhierarchie gezeigt. Außerdem veranschaulicht dieses Beispiel, welche entscheidende Rolle BindableObject
in dieser Hierarchie spielt. BindableObject
wird von Object
abgeleitet und ist die übergeordnete Klasse von Element
, von dem VisualElement
abgeleitet wird. Dies wiederum ist die übergeordnete Klasse von Page
und View
, der übergeordneten Klasse von Layout
:
BindableObject und BindableProperty
In den Klassen, die von BindableObject
abgeleitet werden, wird bei vielen CLR-Eigenschaften davon gesprochen, dass sie von bindbaren Eigenschaften „gestützt“ werden. Bei der Eigenschaft Text
der Klasse Label
handelt es sich beispielsweise um eine CLR-Eigenschaft, die Klasse Label
definiert jedoch auch ein öffentliches statisches schreibgeschütztes Feld TextProperty
vom Typ BindableProperty
.
Anwendungen können die Eigenschaft Text
von Label
auf normale Weise festlegen oder abrufen. Alternativ kann eine Anwendung Text
festlegen, indem sie die Methode SetValue
aufruft, die von BindableObject
mit einem Label.TextProperty
-Argument definiert wird. Gleichermaßen kann eine Anwendung den Wert der Eigenschaft Text
abrufen, indem sie die Methode GetValue
aufruft (auch hier erneut mit einem Label.TextProperty
-Argument). Dieser Vorgang wird im Beispiel PropertySettings veranschaulicht.
Die CLR-Eigenschaft Text
wird tatsächlich vollständig mit den Methoden SetValue
und GetValue
implementiert, die von BindableObject
gemeinsam mit der statischen Eigenschaft Label.TextProperty
definiert sind.
BindableObject
und BindableProperty
bieten Unterstützung für folgende Anwendungsfälle:
- Festlegen von Standardwerten für Eigenschaften
- Speichern aktueller Werte
- Bereitstellen von Mechanismen zum Überprüfen von Eigenschaftswerten
- Sicherstellen von Konsistenz für verwandte Eigenschaften innerhalb einer Klasse
- Reaktion auf Eigenschaftsänderungen
- Auslösen von Benachrichtigungen, wenn sich eine Eigenschaft ändert oder geändert hat
- Unterstützung von Datenbindung
- Unterstützung von Stilen
- Unterstützung von dynamischen Ressourcen
Wenn sich eine Eigenschaft ändert, die von einer bindbaren Eigenschaft gestützt wird, löst BindableObject
ein PropertyChanged
-Ereignis aus, das Auskunft über die geänderte Eigenschaft gibt. Dieses Ereignis wird nicht ausgelöst, wenn die Eigenschaft auf denselben Wert festgelegt wird.
Einige Eigenschaften werden nicht durch bindungsfähige Eigenschaften gesichert, und einige Xamarin.Forms Klassen , wie Span
z. B. – werden nicht von BindableObject
. Da BindableObject
die Methoden SetValue
und GetValue
definiert, können nur Klassen, die von BindableObject
abgeleitet werden, bindbare Eigenschaften unterstützen.
Da Span
keines seiner Eigenschaften ( z Text
. B. ) von einer bindungsfähigen Eigenschaft unterstützt wird, ist dies nicht der FallBindableObject
. Aus diesem Grund wird bei Festlegung von DynamicResource
für die Eigenschaft Text
von Span
im Beispiel DynamicVsStatic des vorherigen Kapitels eine Ausnahme ausgelöst. Das Beispiel DynamicVsStaticCode zeigt, wie mithilfe der Methode SetDynamicResource
, die von Element
definiert wird, eine dynamische Ressource im Code angegeben wird. Das erste Argument ist ein Objekt vom Typ BindableProperty
.
Gleichermaßen verfügt die Methode SetBinding
, die von BindableObject
definiert wird, über ein erstes Argument vom Typ BindableProperty
.
Definieren von bindbaren Eigenschaften
Sie können eigene bindbare Eigenschaften mithilfe der statischen Methode BindableProperty.Create
zum Erstellen eines statischen schreibgeschützten Felds vom Typ BindableProperty
definieren.
Dieser Vorgang wird in der Klasse AltLabel
in der Bibliothek Xamarin.FormsBook.Toolkit veranschaulicht. Die Klasse wird von Label
abgeleitet und ermöglicht die Angabe eines Schriftgrads. Dieser Schritt wird im Beispiel PointSizedText gezeigt.
Es werden vier Argumente der Methode BindableProperty.Create
benötigt:
propertyName
: der Textname der Eigenschaft (identisch mit dem Namen der CLR-Eigenschaft)returnType
: der Typ der CLR-EigenschaftdeclaringType
: der deklarierende Typ der EigenschaftdefaultValue
: der Standardwert der Eigenschaft
Da defaultValue
den Typ object
aufweist, muss der Compiler den Typ des Standardwerts bestimmen können. Wenn für returnType
z.B. double
festgelegt ist, sollte defaultValue
auf einen Wert wie 0.0 anstelle von 0 festgelegt werden. Anderenfalls wird durch den Typenkonflikt während der Laufzeit eine Ausnahme ausgelöst.
Bindbare Eigenschaften umfassen zudem häufig Folgendes:
propertyChanged
: eine statische Methode, die aufgerufen wird, wenn sich der Eigenschaftswert ändert. Das erste Argument ist die Instanz der Klasse, deren Eigenschaft sich geändert hat.
Die übrigen Argumente für BindableProperty.Create
sind weniger gebräuchlich:
defaultBindingMode
: wird in Verbindung mit der Datenbindung verwendet (wie in Kapitel 16 erläutert. Datenbindung)validateValue
: ein Rückruf zur Überprüfung auf einen gültigen WertpropertyChanging
: ein Rückruf, um anzugeben, wann sich die Eigenschaft ändern wirdcoerceValue
: ein Rückruf, um das Ändern eines festgelegten Werts in einen anderen Wert zu erzwingendefaultValueCreate
: ein Rückruf, um einen Standardwert zu erstellen, der nicht von mehreren Instanzen der Klasse gemeinsam verwendet werden kann (z.B. eine Sammlung)
Die schreibgeschützte bindbare Eigenschaft
Eine bindbare Eigenschaft kann als schreibgeschützt festgelegt werden. Um eine schreibgeschützte bindbare Eigenschaft zu erstellen, muss die statische Methode BindableProperty.CreateReadOnly
zum Definieren eines privaten statischen schreibgeschützten Felds vom Typ BindablePropertyKey
aufgerufen werden.
Definieren Sie anschließend den set
-Accessor der CLR-Eigenschaft als private
, um eine SetValue
-Überladung mit dem Objekt BindablePropertyKey
aufzurufen. Dadurch wird verhindert, dass die Eigenschaft außerhalb der Klasse festgelegt wird.
Dieser Vorgang wird in der Klasse CountedLabel
veranschaulicht, die im Beispiel BaskervillesCount verwendet wird.