Zusammenfassung von Kapitel 11. Die bindbare Infrastruktur

Beispiel herunterladen Das Beispiel herunterladen

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:

Screenshot der triple der Klassenhierarchiefreigabe der Klassenhierarchiefreigabe

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 BindableObjectabgeleitet. 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 BindableObjectabgeleitet 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 BindablePropertyzu 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-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 (siehe Kapitel 16: 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. Zum Erstellen einer schreibgeschützten bindbaren Eigenschaft muss die statische Methode BindableProperty.CreateReadOnly aufgerufen werden, um ein privates statisches schreibgeschütztes Feld vom Typ BindablePropertyKeyzu 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.