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 verwandt, unterscheiden sich jedoch in wichtigen Punkten: Mit BindableProperty
wird die Eigenschaft selbst definiert. BindableObject
ist insofern mit object
vergleichbar, als es sich um eine Stammklasse für Klassen handelt, die bindbare 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
.
Eine Anwendung kann die Text
-Eigenschaft von Label
normalerweise festlegen oder abrufen, oder die Anwendung kann festlegen Text
, indem die SetValue
von BindableObject
definierte Methode mit einem Label.TextProperty
Argument aufgerufen wird. Ebenso kann eine Anwendung den Wert der Text
Eigenschaft abrufen, indem sie die GetValue
-Methode aufruft, wiederum 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 bindbare Eigenschaften unterstützt, und einige Xamarin.Forms Klassen – z Span
. B. – werden nicht von BindableObject
abgeleitet. Da BindableObject
die Methoden SetValue
und GetValue
definiert, können nur Klassen, die von BindableObject
abgeleitet werden, bindbare Eigenschaften unterstützen.
Da Span
nicht von BindableObject
abgeleitet wird, wird keine seiner Eigenschaften – z Text
. B. – durch eine bindbare Eigenschaft unterstützt. 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. Im DynamicVsStaticCode-Beispiel wird veranschaulicht, wie dynamische Ressourcen im Code mithilfe der SetDynamicResource
durch definierten -Methode festgelegt werden Element
. Das erste Argument ist ein Objekt vom Typ BindableProperty
.
Auf ähnliche Weise verfügt die SetBinding
von BindableObject
definierte Methode über ein erstes Argument vom Typ BindableProperty
.
Definieren von bindbaren Eigenschaften
Sie können Ihre eigenen bindbaren Eigenschaften mithilfe der statischen BindableProperty.Create
Methode definieren, um ein statisches schreibgeschütztes Feld vom Typ BindableProperty
zu erstellen.
Dies wird in der AltLabel
-Klasse in der Xamarin.FormsBibliothek Book.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 (siehe Kapitel 16: 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. Zum Erstellen einer schreibgeschützten bindbaren Eigenschaft muss die statische Methode BindableProperty.CreateReadOnly
aufgerufen werden, um ein privates statisches schreibgeschütztes Feld vom Typ BindablePropertyKey
zu definieren.
Definieren Sie dann den CLR-Eigenschafts set
accesor als private
, um eine SetValue
Überladung mit dem BindablePropertyKey
-Objekt aufzurufen. Dadurch wird verhindert, dass die Eigenschaft außerhalb der Klasse festgelegt wird.
Dies wird in der CountedLabel
Klasse veranschaulicht, die im BaskervillesCount-Beispiel verwendet wird.