Teilen über


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:

Screenshot zur gemeinsamen Klassenhierarchie

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-Eigenschaft
  • declaringType: der deklarierende Typ der Eigenschaft
  • defaultValue: 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 Wert
  • propertyChanging: ein Rückruf, um anzugeben, wann sich die Eigenschaft ändern wird
  • coerceValue: ein Rückruf, um das Ändern eines festgelegten Werts in einen anderen Wert zu erzwingen
  • defaultValueCreate: 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.