Share via


Grundlegende Bindungen

Browse sample.Beispiel ansehen

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:

Basic code binding.

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 Namen slider.
  • Die Markuperweiterung Binding verknüpft die Rotation-Eigenschaft des Label mit der Value-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}" />

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:

Binding context inheritance.