{x:Bind}-Markuperweiterung

Hinweis Allgemeine Informationen zur Verwendung der Datenbindung in Ihrer App mit {x:Bind} (und einen Vergleich zwischen {x:Bind} und {Binding}) finden Sie unter Datenbindung im Detail.

Die {x:Bind}-Markuperweiterung – neu in Windows 10 – ist eine Alternative zu {Binding}. {x:Bind} wird in weniger Zeit und weniger Arbeitsspeicher als {Binding} ausgeführt und unterstützt ein besseres Debuggen.

Zur XAML-Kompilierungszeit wird {X: Bind} in Code konvertiert, der den Wert aus einer Eigenschaft aus einer Datenquelle abruft und diesen in der im Markup angegeben Eigenschaft festlegt. Das Bindungsobjekt kann optional konfiguriert werden, um Änderungen am Wert der Datenquelleneigenschaft zu beobachten und sich selbst basierend auf diesen Änderungen (Mode="OneWay") zu aktualisieren. Optional kann es auch so konfiguriert werden, dass Änderungen im eigenen Wert zurück an die Quelleigenschaft (Mode="TwoWay") übertragen werden.

Die von {x:Bind} und {Binding} erstellten Bindungsobjekte sind von der Funktionsweise her größtenteils identisch. {x:Bind} führt allerdings speziellen Code aus, der zur Kompilierzeit generiert wird, und {Binding} verwendet eine allgemeine Laufzeitobjektüberprüfung. Folglich bieten {x:Bind}-Bindungen (häufig als kompilierte Bindungen bezeichnet) eine hervorragende Leistung, stellen die Validierung Ihrer Bindungsausdrücke bei der Kompilierung bereit und unterstützen das Debuggen, indem Sie die Möglichkeit erhalten, Haltepunkte in den Codedateien festzulegen, die als Teilklasse für die Seite generiert werden. Diese Dateien befinden sich in Ihrem obj-Ordner und weisen Namen wie <view name>.g.cs auf (für C#).

Tipp

{x:Bind} verfügt im Gegensatz zu {Binding} über den Standardmodus OneTime. Dies wurde aus Leistungsgründen ausgewählt, da die Verwendung von OneWay dazu führt, dass mehr Code generiert wird, um die Änderungserkennung zu integrieren und zu verarbeiten. Sie können explizit einen Modus für die Verwendung der OneWay- oder TwoWay-Bindung angeben. Sie können auch x:DefaultBindMode verwenden, um den Standardmodus für {x:Bind} für ein bestimmtes Segment der Markupstruktur zu ändern. Der angegebene Modus gilt für alle {x:Bind} -Ausdrücke für dieses Element und seine untergeordneten Elemente, die einen Modus nicht explizit als Teil der Bindung angeben.

Beispiel-Apps zur Veranschaulichung von {x:Bind}

XAML-Attributsyntax

<object property="{x:Bind}" .../>
-or-
<object property="{x:Bind propertyPath}" .../>
-or-
<object property="{x:Bind bindingProperties}" .../>
-or-
<object property="{x:Bind propertyPath, bindingProperties}" .../>
-or-
<object property="{x:Bind pathToFunction.functionName(functionParameter1, functionParameter2, ...), bindingProperties}" .../>
Begriff BESCHREIBUNG
Propertypath Eine Zeichenfolge, die den Eigenschaftspfad für die Bindung angibt. Weitere Informationen finden Sie unten im Abschnitt Eigenschaftspfad.
bindingProperties
Propname=value[, propName=value]* Mindestens eine Bindungseigenschaft, die mithilfe einer Name-Wert-Paarsyntax angegeben wird.
propName Der Zeichenfolgenname der für das Binding-Objekt festzulegenden Eigenschaft. Beispiel: „Konverter“.
value Der für die Eigenschaft festzulegende Wert. Die Syntax des Arguments hängt von der festgelegten Eigenschaft ab. Im Folgenden finden Sie ein Beispiel für die Verwendung eines propName-Werts=, bei dem der Wert selbst eine Markuperweiterung ist: .Converter={StaticResource myConverterClass} Weitere Informationen finden Sie unten im Abschnitt Mit {x:Bind} festzulegende Eigenschaften.

Beispiele

<Page x:Class="QuizGame.View.HostView" ... >
    <Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
</Page>

Dieser beispielhafte XAML-Code verwendet {x:Bind} mit einer ListView.ItemTemplate-Eigenschaft. Beachten Sie die Deklaration eines x:DataType-Werts.

  <DataTemplate x:Key="SimpleItemTemplate" x:DataType="data:SampleDataGroup">
    <StackPanel Orientation="Vertical" Height="50">
      <TextBlock Text="{x:Bind Title}"/>
      <TextBlock Text="{x:Bind Description}"/>
    </StackPanel>
  </DataTemplate>

Eigenschaftspfad

PropertyPath legt Path für einen {x:Bind}-Ausdruck fest. Path ist ein Eigenschaftspfad, der den Wert der Eigenschaft, der Untereigenschaft, des Felds oder der Methode angibt, an die bzw. das Sie binden (die Quelle). Sie können den Namen der Path-Eigenschaft explizit erwähnen: {x:Bind Path=...}. Sie können diesen aber auch weglassen: {x:Bind ...}.

Auflösung des Eigenschaftspfads

{x:Bind} verwendet nicht den DataContext als Standardquelle. Stattdessen wird die Seite oder das Benutzersteuerelement selbst verwendet. So sieht der CodeBehind-Abschnitt der Seite oder des Benutzersteuerelements für Eigenschaften, Felder und Methoden aus. Um das Ansichtsmodell für {x:Bind} verfügbar zu machen, sollten Sie in der Regel neue Felder oder Eigenschaften zum CodeBehind-Abschnitt der Seite oder des Benutzersteuerelements hinzufügen. Die Schritte in einem Eigenschaftspfad werden durch Punkte getrennt (.), und Sie können mehrere Trennzeichen angeben, um aufeinander folgende untergeordnete Eigenschaften zu durchlaufen. Verwenden Sie unabhängig von der verwendeten Programmiersprache einen Punkt als Trennzeichen, um das Objekt zu implementieren, an das die Bindung erfolgt.

So sucht Text="{x:Bind Employee.FirstName}" z. B. auf einer Seite nach einem Employee-Mitglied auf der Seite und dann nach einem FirstName-Mitglied für das von Employee zurückgegebene Objekt. Wenn Sie ein ItemsControl-Element an eine Eigenschaft binden, die die abhängigen Elemente des Mitarbeiters enthält, kann der Eigenschaftspfad „Employee.Dependents“ lauten, und die Elementvorlage des ItemsControl-Elements wäre für die Anzeige der Elemente „Dependents“ verantwortlich.

Für C++/CX kann {x:Bind} keine Bindungen an private Felder und Eigenschaften im Seiten- oder Datenmodell durchführen – Sie benötigen eine öffentliche Eigenschaft, damit die Bindung möglich ist. Der Oberflächenbereich für die Bindung muss als CX-Klassen/-Schnittstellen verfügbar gemacht werden, damit die relevanten Metadaten abgerufen werden können. Das Attribut [Bindable] sollte nicht benötigt werden.

Mit x:Bind müssen Sie ElementName=xxx nicht als Teil des Bindungsausdrucks verwenden. Stattdessen können Sie den Namen des Elements als ersten Teil des Pfads für die Bindung verwenden, da benannte Elemente zu Feldern innerhalb des Seiten- oder Benutzersteuerelements werden, das die Stammbindungsquelle darstellt.

Sammlungen

Wenn die Datenquelle eine Auflistung ist, kann der Eigenschaftspfad Elemente in der Auflistung anhand ihrer Position oder ihres Indexes angeben. Beispiel: "Teams[0]. Players", wobei das Literal "[]" die "0" umschließt, die das erste Element in einer nullindizierten Sammlung anfordert.

Um einen Indexer verwenden zu können, muss das Modell IList<T> oder IVector<T> für den Typ der Eigenschaft implementieren, die indiziert werden soll. (Beachten Sie, dass IReadOnlyList<T> und IVectorView<T> unterstützen die Indexersyntax nicht.) Wenn der Typ der indizierten Eigenschaft INotifyCollectionChanged oder IObservableVector unterstützt und die Bindung OneWay oder TwoWay lautet, wird sie registriert und auf Änderungsbenachrichtigungen auf diesen Schnittstellen überwacht. Die Änderungserkennungslogik wird basierend auf allen Auflistungsänderungen aktualisiert, auch wenn sie keine Auswirkungen auf den entsprechenden indizierten Wert hat. Dies geschieht, da die Überwachungslogik für alle Instanzen der Auflistung identisch ist.

Wenn die Datenquelle ein Wörterbuch oder eine Karte ist, kann der Eigenschaftspfad Elemente in der Auflistung anhand ihres Zeichenfolgennamens angeben. TextBlock Text="{x:Bind Players['John Smith']}" /> sucht beispielsweise< nach einem Element im Wörterbuch mit dem Namen "John Smith". Der Name muss in Anführungszeichen gesetzt werden. Dabei können einfache oder doppelte Anführungszeichen verwendet werden. Das Caret-Symbol (^) kann als Escapezeichen für Anführungszeichen innerhalb von Zeichenfolgen verwendet werden. Es ist in der Regel am einfachsten, alternative Anführungszeichen von denen zu verwenden, die für das XAML-Attribut verwendet werden. (Beachten Sie, dass IReadOnlyDictionary<T> und IMapView<T> unterstützen die Indexersyntax nicht.)

Um einen Zeichenfolgen-Indexer verwenden zu können, muss das Modell IDictionary<string, T> oder IMap<string T> für den Typ der Eigenschaft implementieren, die indiziert werden soll. Wenn der Typ der indizierten Eigenschaft IObservableMap unterstützt und die Bindung OneWay oder TwoWay ist, wird er registriert und überwacht Benachrichtigungen auf diesen Schnittstellen. Die Änderungserkennungslogik wird basierend auf allen Auflistungsänderungen aktualisiert, auch wenn sie keine Auswirkungen auf den entsprechenden indizierten Wert hat. Dies geschieht, da die Überwachungslogik für alle Instanzen der Auflistung identisch ist.

Angefügte Eigenschaften

Um eine Bindung an angefügte Eigenschaften zu erstellen, müssen Sie die Klasse und den Eigenschaftennamen nach dem Punkt in Klammern einfügen. Beispiel: Text="{x:Bind Button22.(Grid.Row)}". Wenn die Eigenschaft nicht in einem Xaml-Namespace deklariert wird, müssen Sie ihr einen XML-Namespace als Präfix voranstellen, den Sie einem Codenamespace am Anfang des Dokuments zuordnen sollten.

Umwandlung

Kompilierte Bindungen sind stark typisiert und lösen den Typ der einzelnen Schritte in einem Pfad auf. Wenn der zurückgegebene Typ nicht über den Member verfügt, erzeugt er zur Kompilierzeit einen Fehler. Sie können eine Umwandlung angeben, um der Bindung den tatsächlichen Typ des Objekts mitzuteilen.

Im folgenden Fall ist obj eine Eigenschaft eines Typobjekts, enthält aber ein Textfeld, sodass wir Text="{x:Bind ((TextBox)obj).Text}" oder Text="{x:Bind obj.(TextBox.Text)}"verwenden können.

Das Feld groups3 in Text="{x:Bind ((data:SampleDataGroup)groups3[0]). Title}" ist ein Wörterbuch mit Objekten, daher müssen Sie es in data:SampleDataGroup umwandeln. Beachten Sie die Verwendung des data:-XML-Namespacepräfix für die Zuordnung des Objekttyps zu einem Code-Namespace, der nicht Teil des Standard-XAML-Namespace ist.

Hinweis: Die C#-Umwandlungssyntax ist flexibler als die Syntax der angefügten Eigenschaft und wird künftig als Syntax empfohlen.

Pfadloses Umwandeln

Der native Bindungsparser stellt keinen Schlüsselwort (keyword) bereit, {x:Bind (x:String)}der als Funktionsparameter dargestellt this werden soll, unterstützt jedoch die pfadlose Umwandlung (z. B. ), die als Funktionsparameter verwendet werden kann. Daher ist eine gültige Möglichkeit, das auszuführen, {x:Bind MethodName((namespace:TypeOfThis))} was konzeptionell gleichwertig {x:Bind MethodName(this)}ist.

Beispiel:

Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}"

<Page
    x:Class="AppSample.MainPage"
    ...
    xmlns:local="using:AppSample">

    <Grid>
        <ListView ItemsSource="{x:Bind Songs}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:SongItem">
                    <TextBlock
                        Margin="12"
                        FontSize="40"
                        Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>
namespace AppSample
{
    public class SongItem
    {
        public string TrackName { get; private set; }
        public string ArtistName { get; private set; }

        public SongItem(string trackName, string artistName)
        {
            ArtistName = artistName;
            TrackName = trackName;
        }
    }

    public sealed partial class MainPage : Page
    {
        public List<SongItem> Songs { get; }
        public MainPage()
        {
            Songs = new List<SongItem>()
            {
                new SongItem("Track 1", "Artist 1"),
                new SongItem("Track 2", "Artist 2"),
                new SongItem("Track 3", "Artist 3")
            };

            this.InitializeComponent();
        }

        public static string GenerateSongTitle(SongItem song)
        {
            return $"{song.TrackName} - {song.ArtistName}";
        }
    }
}

Funktionen in Bindungspfaden

Ab Windows 10, Version 1607, unterstützt {x: Bind} die Verwendung einer Funktion als blattbildenden Schritt des Bindungspfades. Dies ist ein leistungsstarkes Feature für die Datenbindung, das mehrere Szenarien im Markup ermöglicht. Weitere Informationen finden Sie unter Funktionsbindungen .

Ereignisbindung

Ereignisbindung ist ein besonderes Feature der kompilierte Bindung. Damit können Sie den Handler für ein Ereignis mit einer Bindung angeben. Es muss also keine Methode im CodeBehind-Abschnitt sein. Beispiel: Click="{x:Bind rootFrame.GoForward}".

Bei Ereignissen muss die Zielmethode nicht überladen werden und muss Folgendes erfüllen:

  • Sie muss mit der Signatur des Ereignisses übereinstimmen
  • ODER keine Parameter enthalten
  • ODER die gleiche Anzahl von Parametern von Typen enthalten, die alle von den Typen der Ereignisparameter zugeordnet werden können.

Im generierten CodeBehind-Abschnitt verarbeitet die kompilierte Bindung das Ereignis und leitet es an die Methode für das Modell weiter. Dabei wird der Pfad des Bindungsausdrucks ausgewertet, wenn das Ereignis eintritt. Dies bedeutet, dass – im Gegensatz zu Eigenschaftsbindungen – keine Änderungen am Modell nachverfolgt werden.

Weitere Informationen zur Zeichenfolgensyntax für einen Eigenschaftspfad finden Sie unter Property-path-Syntax. Beachten Sie die Unterschiede, die hier für {x:Bind} beschrieben werden.

Mit {x:Bind} festzulegende Eigenschaften

{x:Bind} wird mit der bindingProperties-Platzhaltersyntax angegeben, da in der Markuperweiterung mehrere Lese-/Schreibeigenschaften einer Binding-Klasse festgelegt werden können. Die Eigenschaften können in beliebiger Reihenfolge mit durch Trennzeichen getrennten propName-Wertpaaren= festgelegt werden. Beachten Sie, dass Sie in den Bindungsausdruck keine Zeilenumbrüche einschließen können. Für einige Eigenschaften sind Typen erforderlich, die keine Typkonvertierung enthalten, sodass für diese eigene innerhalb von {x:Bind} geschachtelte Markuperweiterungen erforderlich sind.

Diese Eigenschaften funktionieren ähnlich wie die Eigenschaften der Binding-Klasse.

Eigenschaft Beschreibung
Pfad Weitere Informationen finden Sie weiter oben im Abschnitt Eigenschaftspfad.
Converter Gibt das Konverterobjekt an, das vom Bindungsmodul aufgerufen wird. Der Konverter kann in XAML festgelegt werden, sofern Sie dabei auf eine Objektinstanz verweisen, die Sie in einer {StaticResource}-Markuperweiterung zugewiesen haben. Verweisen Sie anschließend im Ressourcenwörterbuch auf dieses Objekt.
ConverterLanguage Gibt die Kultur an, die vom Konverter verwendet werden soll. (Wenn Sie ConverterLanguage festlegen, sollten Sie auch Converter festlegen.) Die Kultur kann als standardbasierter Bezeichner festgelegt werden. Weitere Informationen finden Sie unter ConverterLanguage.
ConverterParameter Gibt den Konverterparameter an, der in der Konverterlogik verwendet werden kann. (Wenn Sie ConverterParameter festlegen, sollten Sie auch Converter festlegen.) Die meisten Konverter verwenden einfache Logik und rufen alle erforderlichen Informationen aus dem zu konvertierenden übergebenen Wert ab. Sie benötigen keinen ConverterParameter-Wert. Der ConverterParameter-Parameter ist für etwas weiter fortgeschrittene Konverterimplementierungen mit mehr als einer Logik gedacht, die überprüft, was in ConverterParameter übergeben wird. Sie können einen Konverter schreiben, der andere Werte als Zeichenfolgen verwendet. Dies ist jedoch ungewöhnlich. Weitere Informationen finden Sie unter Hinweise in ConverterParameter .
FallbackValue Gibt einen Wert an, der angezeigt wird, wenn die Quelle oder der Pfad nicht aufgelöst werden können.
Mode Gibt den Bindungsmodus als eine der folgenden Zeichenfolgen an: „OneTime“, „OneWay“ oder „TwoWay“. Der Standard lautet "OneTime". Beachten Sie, dass dieser vom Standardwert für {Binding} abweicht, der in den meisten Fällen "OneWay" lautet.
TargetNullValue Gibt einen Wert an, der angezeigt wird, wenn der Quellwert aufgelöst werden kann, aber explizit null ist.
BindBack Gibt eine Funktion an, die für die umgekehrter Richtung einer bidirektionalen Bindung verwendet wird.
UpdateSourceTrigger Gibt an, wann Änderungen vom Steuerelement zurück an das Modell in TwoWay-Bindungen gepusht werden sollen. Der Standardwert für alle Eigenschaften außer TextBox.Text ist PropertyChanged; TextBox.Text ist LostFocus.

Hinweis

Wenn Sie Markup von {Binding} in {x:Bind} konvertieren, beachten Sie die Unterschiede in den Standardwerten für die Mode-Eigenschaft . X:DefaultBindMode können verwendet werden, um den Standardmodus für X: Bind für ein bestimmtes Segment des der Markup-Struktur ändern. Der ausgewählte Modus wendet alle x:Bind-Ausdrücke auf dieses Element und seine untergeordneten Elemente an, die einen Modus nicht explizit als Teil der Bindung angeben. OneTime ist performanter als OneWay, da die Verwendung von OneWay dazu führt, dass mehr Code generiert wird, um die Änderungserkennung zu integrieren und zu verarbeiten.

Hinweise

Da {x:Bind} generierten Code für die optimale Nutzung verwendet, sind zur Kompilierzeit Typinformationen erforderlich. Dies bedeutet, dass Sie nur an Eigenschaften binden können, für die Sie den Typ vorab kennen. Aus diesem Grund können Sie {x:Bind} nicht mit der DataContext-Eigenschaft verwenden, die vom Typ Object ist und außerdem zur Laufzeit geändert werden kann.

Wenn Sie {x:Bind} mit Datenvorlagen verwenden, müssen Sie den Typ angeben, an den gebunden wird, indem Sie einen x:DataType-Wert festlegen, wie im Abschnitt Beispiele gezeigt. Sie können den Typ auch auf eine Schnittstelle oder einen Basisklassentyp festlegen und dann ggf. Umwandlungen verwenden, um einen vollständigen Ausdruck zu formulieren.

Kompilierte Bindungen hängen von der Codegenerierung ab. Wenn Sie daher {x:Bind} in einem Ressourcenwörterbuch verwenden, muss das Ressourcenwörterbuch über eine CodeBehind-Klasse verfügen. Ein Codebeispiel finden Sie unter Ressourcenwörterbücher mit {x:Bind}.

Bei Seiten und Benutzersteuerelementen, die kompilierte Bindungen umfassen, befindet sich im generierten Code eine "Bindings"-Eigenschaft. Dazu gehören folgende Methoden:

  • Update() - Hiermit werden die Werte aller kompilierten Bindungen aktualisiert. Für alle unidirektionalen und bidirektionalen Bindungen werden zur Erkennung von Änderungen Listener eingehängt.
  • Initialize(): Wenn die Bindungen nicht bereits initialisiert wurden, wird zur Initialisierung der Bindungen Update() aufgerufen
  • StopTracking() - Hängt die für uni- und bidirektionale Bindungen erstellen Listener aus. Sie können mit der Methode Update() erneut initialisiert werden.

Hinweis

Ab Windows 10, Version 1607, wird über das XAML-Framework ein integrierter Konverter für die Konvertierung eines booleschen Operanden in einen Sichtbarkeitszustand bereitgestellt. Der Konverter ordnet true dem Visible-Enumerationswert und false dem Wert Reduziert zu, sodass Sie eine Visibility-Eigenschaft an einen booleschen Wert binden können, ohne einen Konverter zu erstellen. Beachten Sie, dass dies kein Feature der Funktionsbindung ist, nur eine Eigenschaftsbindung. Für die Verwendung des integrierten Konverters muss die SDK-Zielversion der App mindestens 14393 lauten. Die Verwendung ist nicht möglich, wenn Ihre App für frühere Versionen von Windows 10 bestimmt ist. Weitere Informationen zu Zielversionen finden Sie unter Versionsadaptiver Code.

Tipp Wenn Sie eine einzelne geschweifte Klammer für einen Wert angeben müssen, z. B. in Path oder ConverterParameter, stellen Sie ihm einen umgekehrten Schrägstrich voran: \{. Setzen Sie alternativ die gesamte Zeichenfolge mit den geschweiften Klammern, für die Escapezeichen verwendet werden müssen, in weitere Anführungszeichen, z. B. ConverterParameter='{Mix}'.

Converter, ConverterLanguage und ConverterLanguage hängen mit der Konvertierung eines Werts oder Typs aus der Bindungsquelle in einen mit der Bindungszieleigenschaft kompatiblen Typ oder Wert zusammen. Weitere Informationen und Beispiele finden Sie im Abschnitt „Datenkonvertierungen“ unter Datenbindung im Detail.

{x:Bind} ist nur eine Markuperweiterung ohne Methode zum programmgesteuerten Erstellen oder Ändern dieser Bindungen. Weitere Informationen zu Markuperweiterungen finden Sie in der XAML-Übersicht.