Grundlegende Bindungen
Eine .NET Multi-platform App UI (.NET MAUI)-Datenbindung verknüpft ein Paar von Eigenschaften zwischen zwei Objekten, von denen mindestens eines in der Regel ein Benutzeroberflächenobjekt ist. Diese beiden Objekte sind das Ziel und die Quelle:
- Das Ziel ist das Objekt (und die Eigenschaft), auf dem die Datenbindung festgelegt wird.
- Die Quelle ist das Objekt (und die Eigenschaft), auf die von der Datenbindung verwiesen wird.
Im einfachsten Fall fließen Daten von der Quelle zum Ziel. Das bedeutet, dass der Wert der Zieleigenschaft über den Wert der Quelleigenschaft festgelegt wird. In einigen Fällen können Daten jedoch auch vom Ziel zur Quelle fließen oder sogar in beide Richtungen.
Wichtig
Das Ziel ist immer das Objekt, auf das die Datenbindung gesetzt wird, auch wenn es Daten liefert und nicht empfängt.
Bindungen mit Bindungskontext
Betrachten Sie das folgende XAML Beispiel, bei dem ein Label durch Manipulation eines Slider gedreht werden soll:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DataBindingDemos.BasicCodeBindingPage"
Title="Basic Code Binding">
<StackLayout Padding="10, 0">
<Label x:Name="label"
Text="TEXT"
FontSize="48"
HorizontalOptions="Center"
VerticalOptions="Center" />
<Slider x:Name="slider"
Maximum="360"
VerticalOptions="Center" />
</StackLayout>
</ContentPage>
Ohne Datenbindungen würden Sie das ValueChanged
-Ereignis des Slider auf einen Ereignishandler festlegen, der auf die Value
-Eigenschaft des Slider zugreift und den Wert auf die Rotation
-Eigenschaft des Label festlegt. Durch die Datenbindung wird diese Aufgabe automatisiert, so dass der Ereignishandler und der darin enthaltene Code nicht mehr erforderlich sind.
Sie können eine Bindung auf einer Instanz einer beliebigen Klasse festlegen, die von BindableObject abgeleitet wurde. Dazu zählen Element-, VisualElement-, View- und View-Derivate. Die Bindung wird immer auf dem Zielobjekt festgelegt. Die Bindung verweist auf das Quellobjekt. Verwenden Sie die beiden folgenden Member der Zielklasse, um die Datenbindung herzustellen:
- Die
BindingContext
-Eigenschaft gibt das Quellobjekt an. - Die
SetBinding
-Methode gibt die Ziel- und Quelleigenschaft an.
In diesem Beispiel ist das Label das Bindungsziel, und der Slider ist die Bindungsquelle. Änderungen der Slider-Quelle wirken sich auf die Drehung des Label-Ziels aus. Daten fließen von der Quelle zum Ziel.
Die von BindableObject definierte SetBinding
-Methode weist ein Argument vom Typ BindingBase
auf, von dem die Binding
-Klasse abgeleitet wird. Es gibt aber auch andere SetBinding
-Methoden, die von der BindableObjectExtensions
-Klasse definiert werden. Der CodeBehind für den XAML verwendet eine einfachere SetBinding
Erweiterungsmethode aus der BindableObjectExtensions
Klasse:
public partial class BasicCodeBindingPage : ContentPage
{
public BasicCodeBindingPage()
{
InitializeComponent();
label.BindingContext = slider;
label.SetBinding(Label.RotationProperty, "Value");
}
}
Das Label ist das Bindungsziel. Deshalb wird diese Eigenschaft dort festgelegt, und dort wird die Methode aufgerufen. Die BindingContext
-Eigenschaft gibt die Bindungsquelle an, der Slider. Die SetBinding
-Methode wird auf dem Bindungsziel aufgerufen, gibt aber sowohl die Ziel- als auch die Quelleigenschaft an. Die Zieleigenschaft wird als BindableProperty-Objekt angegeben: Label.RotationProperty
. Die Quelleigenschaft wird als Zeichenfolge angegeben und gibt die Value
-Eigenschaft des Slider an.
Wichtig
Die Zieleigenschaft muss von einer bindbaren Eigenschaft unterstützt werden. Daher muss das Zielobjekt eine Instanz einer Klasse sein, die sich von BindableObject ableitet. Weitere Informationen finden Sie unter Bindbare Eigenschaften.
Die Quelleigenschaft wird als Zeichenfolge angegeben. Intern wird die Reflektion verwendet, um auf die tatsächliche Eigenschaft zuzugreifen. In diesem Fall wird die Value
-Eigenschaft jedoch auch von einer bindbaren Eigenschaft unterstützt.
Wenn Sie Slider anpassen, rotiert Label dementsprechend:
Alternativ kann die Datenbindung in XAML angegeben werden:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DataBindingDemos.BasicXamlBindingPage"
Title="Basic XAML Binding">
<StackLayout Padding="10, 0">
<Label Text="TEXT"
FontSize="80"
HorizontalOptions="Center"
VerticalOptions="Center"
BindingContext="{x:Reference Name=slider}"
Rotation="{Binding Path=Value}" />
<Slider x:Name="slider"
Maximum="360"
VerticalOptions="Center" />
</StackLayout>
</ContentPage>
Die Datenbindung wird genau wie im Code auf dem Zielobjekt festgelegt, in diesem Fall Label. Zum Definieren der Datenbindung werden zwei XAML-Markup-Erweiterungen verwendet:
- Die Markuperweiterung
x:Reference
ist erforderlich, um auf das Quellobjekt zu verweisen, auf den Slider mit dem Namenslider
. - Die Markuperweiterung
Binding
verknüpft dieRotation
-Eigenschaft des Label mit derValue
-Eigenschaft des Slider.
Weitere Informationen über XAML-Markup-Erweiterungen finden Sie unter Nutzen von XAML-Markup-Erweiterungen.
Hinweis
Die Quelleigenschaft wird mit der Path
Eigenschaft der Binding
Markup-Erweiterung angegeben, die der Path
Eigenschaft der Binding
Klasse entspricht.
Für XAML-Markuperweiterungen wie x:Reference
und Binding
können Inhaltseigenschaftsattribute definiert werden. Für XAML-Markuperweiterungen bedeutet das, dass der Eigenschaftenname nicht verwendet werden muss. Die Eigenschaft Name
ist die Inhaltseigenschaft von x:Reference
, und die Path
-Eigenschaft ist die Inhaltseigenschaft von Binding
. Das bedeutet, dass sie nicht im Ausdruck verwendet werden müssen:
<Label Text="TEXT"
FontSize="80"
HorizontalOptions="Center"
VerticalOptions="Center"
BindingContext="{x:Reference slider}"
Rotation="{Binding Value}" />
Wichtig
Die Bindungsleistung kann mithilfe kompilierter Bindungen verbessert werden. Für weitere Informationen siehe Kompilierte Bindungen.
Bindungen ohne Bindungskontext
Die Eigenschaft BindingContext
ist ein wichtiger Bestandteil von Datenbindungen. Sie ist jedoch nicht immer notwendig. Das Quellobjekt kann stattdessen im SetBinding
Aufruf oder in der Binding
Markup-Erweiterung angegeben werden:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DataBindingDemos.AlternativeCodeBindingPage"
Title="Alternative Code Binding">
<StackLayout Padding="10, 0">
<Label x:Name="label"
Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Slider x:Name="slider"
Minimum="-2"
Maximum="2"
VerticalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage>
In diesem Beispiel wird die Slider definiert, um die Scale
Eigenschaft der Label zu steuern. Aus diesem Grund ist der Slider auf einen Bereich von -2 bis 2 eingestellt.
Die CodeBehind-Datei legt die Bindung mit der SetBinding
Methode fest, wobei das zweite Argument ein Konstruktor für die Binding
Klasse ist:
public partial class AlternativeCodeBindingPage : ContentPage
{
public AlternativeCodeBindingPage()
{
InitializeComponent();
label.SetBinding(Label.ScaleProperty, new Binding("Value", source: slider));
}
}
Der Konstruktor Binding
verfügt über sechs Parameter, weshalb der Parameter source
mit einem benannten Argument angegeben wird. Das Argument ist das slider
-Objekt.
Hinweis
Die VisualElement-Klasse definiert auch die Eigenschaften ScaleX
und ScaleY
, die das VisualElement horizontal und vertikal skalieren können.
Alternativ kann die Datenbindung in XAML angegeben werden:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DataBindingDemos.AlternativeXamlBindingPage"
Title="Alternative XAML Binding">
<StackLayout Padding="10, 0">
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="Center"
Scale="{Binding Source={x:Reference slider},
Path=Value}" />
<Slider x:Name="slider"
Minimum="-2"
Maximum="2"
VerticalOptions="Center" />
</StackLayout>
</ContentPage>
In diesem Beispiel sind für die Markup-Erweiterung Binding
zwei Eigenschaften festgelegt, Source
und Path
, die durch ein Komma getrennt sind. Die Eigenschaft Source
wird auf eine eingebettete x:Reference
-Markuperweiterung festgelegt. Dabei wird die gleiche Syntax wie beim Festlegen des BindingContext
verwendet.
Die Inhaltseigenschaft der Markuperweiterung Binding
ist Path
, aber Path=
-Teil der Markuperweiterung kann nur weg gelassen werden, wenn sie die erste Eigenschaft im Ausdruck ist. Tauschen Sie die beiden Eigenschaften, um den Path=
-Teil weglassen zu können:
Scale="{Binding Value, Source={x:Reference slider}}" />
Obwohl XAML-Markuperweiterungen normalerweise durch geschweifte Klammern getrennt werden, können sie auch als Objektelemente ausgedrückt werden:
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label.Scale>
<Binding Source="{x:Reference slider}"
Path="Value" />
</Label.Scale>
</Label>
In diesem Beispiel sind die Eigenschaften Source
und Path
normale XAML-Attribute. Die Werte befinden sich in Anführungszeichen, und die Attribute sind nicht durch Kommas getrennt. Die Markuperweiterung x:Reference
kann auch ein Objektelement werden:
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label.Scale>
<Binding Path="Value">
<Binding.Source>
<x:Reference Name="slider" />
</Binding.Source>
</Binding>
</Label.Scale>
</Label>
Diese Syntax ist unüblich, aber manchmal nötig, wenn komplexe Objekte involviert sind.
In den besprochenen Beispielen wurde die BindingContext
-Eigenschaft und die Source
-Eigenschaft von Binding
auf eine x:Reference
-Markuperweiterung festgelegt, um auf eine andere Ansicht auf der Seite zu verweisen. Die beiden Eigenschaften weisen den Typ Object
auf, und sie können auf ein beliebiges Objekt festgelegt werden, das Eigenschaften enthält, die für Bindungsquellen geeignet sind. Sie können die BindingContext
- oder Source
Eigenschaft auch auf eine x:Static
Markup-Erweiterung setzen, um auf den Wert einer statischen Eigenschaft oder eines Feldes zu verweisen, oder auf eine StaticResource
Markup-Erweiterung, um auf ein in einem Ressourcenverzeichnis gespeichertes Objekt zu verweisen, oder direkt auf ein Objekt, bei dem es sich häufig um eine Instanz eines Viewmodels handelt.
Hinweis
Die BindingContext
-Eigenschaft kann auch auf ein Binding
-Objekt festgelegt werden, sodass die Eigenschaften Source
und Path
von Binding
den Bindungskontext definieren.
Vererbung von Bindungskontexten
Sie können das Quellobjekt mithilfe der BindingContext
Eigenschaft oder der Source
Eigenschaft des Binding
Objekts angeben. Wenn beide Eigenschaften festgelegt sind, hat die Source
-Eigenschaft des Binding
-Objekts Vorrang vor der BindingContext
-Eigenschaft.
Wichtig
Der BindingContext
Eigenschaftswert wird über die visuellen Struktur vererbt.
Das folgende XAML Beispiel zeigt die Vererbung des Bindungskontexts:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="DataBindingDemos.BindingContextInheritancePage"
Title="BindingContext Inheritance">
<StackLayout Padding="10">
<StackLayout VerticalOptions="Fill"
BindingContext="{x:Reference slider}">
<Label Text="TEXT"
FontSize="80"
HorizontalOptions="Center"
VerticalOptions="End"
Rotation="{Binding Value}" />
<BoxView Color="#800000FF"
WidthRequest="180"
HeightRequest="40"
HorizontalOptions="Center"
VerticalOptions="Start"
Rotation="{Binding Value}" />
</StackLayout>
<Slider x:Name="slider"
Maximum="360" />
</StackLayout>
</ContentPage>
In diesem Beispiel wird die BindingContext
Eigenschaft des StackLayout Objekts auf slider
festgelegt. Dieser Bindungskontext wird sowohl vom Label als auch von BoxView geerbt. Deren Rotation
-Eigenschaften werden auf die Value
-Eigenschaft des Slider festgelegt: