{x:Bind}-Markuperweiterung
Hinweis Allgemeine Informationen zur Verwendung der Datenbindung in Ihrer App mit {x:Bind} (und für einen Gesamtvergleich zwischen {x:Bind} und {Binding}) finden Sie unter Datenbindung im Detail.
Die {x:Bind} -Markuperweiterung – neu für Windows 10 – ist eine Alternative zu {Binding}. {x:Bind} wird in kürzerer Zeit und weniger Arbeitsspeicher als {Binding} ausgeführt und unterstützt ein besseres Debuggen.
Zur XAML-Kompilierungszeit wird {x:Bind} in Code konvertiert, der einen Wert aus einer Eigenschaft in einer Datenquelle erhält und für die im Markup angegebene Eigenschaft festlegt. Das Bindungsobjekt kann optional konfiguriert werden, um Änderungen am Wert der Datenquelleneigenschaft zu beobachten und sich basierend auf diesen Änderungen zu aktualisieren (Mode="OneWay"
). Sie kann optional auch so konfiguriert werden, dass Änderungen in ihrem eigenen Wert zurück an die Quelleigenschaft (Mode="TwoWay"
) verschoben werden.
Die von {x:Bind} und {Binding} erstellten Bindungsobjekte sind von der Funktionsweise her größtenteils identisch. {x:Bind} führt jedoch speziellen Code aus, der zur Kompilierungszeit generiert wird, und {Binding} verwendet eine allgemeine Laufzeitobjektüberprüfung. Daher bieten {x:Bind}-Bindungen (häufig als kompilierte Bindungen bezeichnet) eine hervorragende Leistung, stellen eine Kompilierungszeitüberprüfung Ihrer Bindungsausdrücke bereit und unterstützen das Debuggen, indem Sie Haltepunkte in den Codedateien festlegen können, die als Teilklasse für Ihre 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 über einen Standardmodus von OneTime, im Gegensatz zu {Binding}, der über einen Standardmodus von OneWay verfügt. Dies wurde aus Leistungsgründen ausgewählt, da die Verwendung von OneWay dazu führt, dass mehr Code generiert wird, um die Änderungserkennung zu verbinden und zu behandeln. 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 keinen Modus 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]* | Eine oder mehrere Bindungseigenschaften, die mithilfe einer Namens-/Wertpaarsyntax angegeben werden. |
propName | Der Zeichenfolgenname der Eigenschaft, die für das Bindungsobjekt festgelegt werden soll. Beispiel: "Converter". |
value | Der für die Eigenschaft festzulegende Wert. Die Syntax des Arguments hängt von der festgelegten Eigenschaft ab. Hier ist ein Beispiel für eine propName-Wertverwendung=, bei der der Wert selbst eine Markuperweiterung ist: . Converter={StaticResource myConverterClass} Weitere Informationen finden Sie weiter unten unter "Eigenschaften", die Sie im Abschnitt "{x:Bind} " festlegen können. |
Beispiele
<Page x:Class="QuizGame.View.HostView" ... >
<Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
</Page>
In diesem Beispiel-XAML wird {x:Bind} mit einer ListView.ItemTemplate-Eigenschaft verwendet. 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 den Pfad 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 Sie binden (die Quelle). Sie können den Namen der Path-Eigenschaft explizit erwähnen: {x:Bind Path=...}
. Oder Sie können es weglassen: {x:Bind ...}
.
Auflösung des Eigenschaftspfads
{x:Bind} verwendet DataContext nicht als Standardquelle, sondern verwendet die Seite oder das Benutzersteuerelement selbst. Daher sieht es im CodeBehind Ihrer Seite oder des Benutzersteuerelements nach Eigenschaften, Feldern und Methoden aus. Um Ihr Ansichtsmodell für {x:Bind} verfügbar zu machen, möchten Sie in der Regel dem CodeBehind für Ihre Seite oder das Benutzersteuerelement neue Felder oder Eigenschaften hinzufügen. Schritte in einem Eigenschaftspfad werden durch Punkte (.) getrennt, und Sie können mehrere Trennzeichen einschließen, um aufeinander folgende Untereigenschaften zu durchlaufen. Verwenden Sie das Punkttrennzeichen unabhängig von der Programmiersprache, an die das Objekt gebunden wird.
Beispiel: In einer Seite sucht Text="{x:Bind Employee.FirstName}" nach einem Mitarbeitermitglied auf der Seite und dann nach einem FirstName-Element für das von Employee zurückgegebene Objekt. Wenn Sie ein Elementsteuerelement an eine Eigenschaft binden, die die Abhängigen eines Mitarbeiters enthält, lautet ihr Eigenschaftspfad möglicherweise "Employee.Dependents", und die Elementvorlage des Elementsteuerelements übernimmt die Anzeige der Elemente in "Abhängige".
Für C++/CX kann {x:Bind} keine Bindung an private Felder und Eigenschaften auf der Seite oder im Datenmodell herstellen . Sie müssen über eine öffentliche Eigenschaft verfügen, damit sie gebunden werden kann. Der Oberflächenbereich für die Bindung muss als CX-Klassen/Schnittstellen verfügbar gemacht werden, damit wir die relevanten Metadaten abrufen können. Das [Bindable] -Attribut sollte nicht benötigt werden.
Bei "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 der Seite oder des Benutzersteuerelements werden, die die Stammbindungsquelle darstellt.
Sammlungen
Wenn es sich bei der Datenquelle um eine Auflistung handelt, kann ein Eigenschaftspfad Elemente in der Auflistung anhand ihrer Position oder ihres Indexes angeben. Beispiel: "Teams[0]. Spieler", wobei das Literal "[]" den "0" einschließt, der das erste Element in einer nullindizierten Sammlung anfordert.
Um einen Indexer zu verwenden, 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 ist, registriert und lauscht auf Änderungsbenachrichtigungen für diese Schnittstellen. Die Änderungserkennungslogik wird basierend auf allen Sammlungsänderungen aktualisiert, auch wenn sich dies nicht auf den spezifischen indizierten Wert auswirkt. Dies liegt daran, dass die Überwachungslogik in allen Instanzen der Auflistung gemeinsam ist.
Wenn es sich bei der Datenquelle um ein Wörterbuch oder eine Zuordnung handelt, kann ein Eigenschaftspfad Elemente in der Auflistung anhand ihres Zeichenfolgennamens angeben. Beispiel <: TextBlock Text="{x:Bind Players['John Smith']}" /> sucht nach einem Element im Wörterbuch namens "John Smith". Der Name muss in Anführungszeichen eingeschlossen werden, und es können einfache oder doppelte Anführungszeichen verwendet werden. Hat (^) kann verwendet werden, um Anführungszeichen in Zeichenfolgen zu escapen. 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 Zeichenfolgenindexer zu verwenden, muss das Modell IDictionary-Zeichenfolge<, T> oder IMap-Zeichenfolge<implementieren, T> für den Typ der Eigenschaft, die indiziert werden soll. Wenn der Typ der indizierten Eigenschaft IObservableMap unterstützt und die Bindung OneWay oder TwoWay ist, registriert und lauscht er auf Änderungsbenachrichtigungen für diese Schnittstellen. Die Änderungserkennungslogik wird basierend auf allen Sammlungsänderungen aktualisiert, auch wenn sich dies nicht auf den spezifischen indizierten Wert auswirkt. Dies liegt daran, dass die Überwachungslogik in allen Instanzen der Auflistung gemeinsam ist.
Angefügte Eigenschaften
Um eine Bindung an angefügte Eigenschaften zu erstellen, müssen Sie den Klassen- und Eigenschaftennamen nach dem Punkt in Klammern setzen. Beispiel : Text="{x:Bind Button22.( Grid.Row)}". Wenn die Eigenschaft nicht in einem Xaml-Namespace deklariert ist, müssen Sie der Eigenschaft einen XML-Namespace voranstellen, den Sie einem Codenamespace am Anfang des Dokuments zuordnen sollten.
Umwandlung
Kompilierte Bindungen sind stark typiert und lösen den Typ der einzelnen Schritte in einem Pfad auf. Wenn der zurückgegebene Typ nicht über das Element verfügt, schlägt er zur Kompilierungszeit fehl. Sie können eine Umwandlung angeben, um die Bindung des tatsächlichen Typs des Objekts mitzuteilen.
Im folgenden Fall ist obj eine Eigenschaft vom Typobjekt, enthält aber ein Textfeld, sodass wir entweder Text="{x:Bind ((TextBox)obj) verwenden können. Text}" oder Text="{x:Bind obj.(TextBox.Text)}".
Das Feld "groups3 " in Text="{x:Bind ((data:SampleDataGroup)groups3[0]). Title}" ist ein Wörterbuch von Objekten, daher müssen Sie es in "data:SampleDataGroup" umwandeln. Beachten Sie die Verwendung der XML-Daten : Namespacepräfix zum Zuordnen des Objekttyps zu einem Codenamespace, der nicht Teil des standardmäßigen XAML-Namespace ist.
Hinweis: Die C#-Format-Umwandlungssyntax ist flexibler als die Syntax der angefügten Eigenschaft und wird in Zukunft empfohlen.
Pfadlose Umwandlung
Der systemeigene Bindungsparser stellt kein Schlüsselwort bereit, das als Funktionsparameter dargestellt this
werden soll, unterstützt jedoch pfadlose Umwandlungen (z {x:Bind (x:String)}
. B. ), die als Funktionsparameter verwendet werden können. Daher ist eine gültige Methode, {x:Bind MethodName((namespace:TypeOfThis))}
um das konzeptuelle Äquivalent zu {x:Bind MethodName(this)}
erfüllen.
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 leistungsfähiges Feature für die Datenbindung, das mehrere Szenarien im Markup ermöglicht. Details finden Sie unter Funktionsbindungen .
Ereignisbindung
Ereignisbindung ist ein eindeutiges Feature für kompilierte Bindung. Sie können den Handler für ein Ereignis mithilfe einer Bindung angeben, anstatt es eine Methode für den CodeBehind zu sein. Beispiel: Click="{x:Bind rootFrame.GoForward}".
Für Ereignisse darf die Zielmethode nicht überladen werden und muss auch:
- Stimmen Sie mit der Signatur des Ereignisses überein.
- OR hat keine Parameter.
- ODER haben dieselbe Anzahl von Parametern von Typen, die aus den Typen der Ereignisparameter zugewiesen werden können.
Im generierten CodeBehind verarbeitet die kompilierte Bindung das Ereignis und leitet es an die Methode im Modell weiter und wertet den Pfad des Bindungsausdrucks aus, wenn das Ereignis auftritt. Dies bedeutet, dass im Gegensatz zu Eigenschaftenbindungen keine Änderungen am Modell nachverfolgt werden.
Weitere Informationen zur Zeichenfolgensyntax für einen Eigenschaftspfad finden Sie unter Eigenschaftspfadsyntax, wobei Sie die hier beschriebenen Unterschiede für {x:Bind} berücksichtigen.
Eigenschaften, die Sie mit {x:Bind} festlegen können
{x:Bind} wird mit der BindingProperties-Platzhaltersyntax veranschaulicht, da mehrere Lese-/Schreibeigenschaften vorhanden sind, die in der Markuperweiterung festgelegt werden können. Die Eigenschaften können in beliebiger Reihenfolge mit kommagetrennten PropName-Wertpaaren= festgelegt werden. Beachten Sie, dass Sie keine Zeilenumbrüche in den Bindungsausdruck einschließen können. Einige der Eigenschaften erfordern Typen, die keine Typkonvertierung aufweisen. Daher erfordern diese Markuperweiterungen eigene geschachtelte Markuperweiterungen innerhalb von {x:Bind}.
Diese Eigenschaften funktionieren ähnlich wie die Eigenschaften der Binding-Klasse.
Eigenschaft | Beschreibung |
---|---|
Pfad | Siehe den Abschnitt "Eigenschaftspfad " weiter oben. |
Konverter | Gibt das Konverterobjekt an, das vom Bindungsmodul aufgerufen wird. Der Konverter kann in XAML festgelegt werden, aber nur, wenn Sie auf eine Objektinstanz verweisen, die Sie in einem {StaticResource}-Markuperweiterungsverweis auf dieses Objekt im Ressourcenwörterbuch zugewiesen haben. |
ConverterLanguage | Gibt die Kultur an, die vom Konverter verwendet werden soll. (Wenn Sie festlegen ConverterLanguage sollten Sie auch "Converter" festlegen.) Die Kultur wird als standardbasierte ID festgelegt. Weitere Informationen finden Sie unter ConverterLanguage. |
ConverterParameter | Gibt den Konverterparameter an, der in der Konverterlogik verwendet werden kann. (Wenn Sie festlegen ConverterParameter sollten Sie auch "Converter" festlegen.) Die meisten Konverter verwenden einfache Logik, die alle benötigten Informationen aus dem übergebenen Wert abrufen, um zu konvertieren, und benötigen keinen ConverterParameter-Wert. Der Parameter ConverterParameter richtet sich an mäßig fortgeschrittene Konverterimplementierungen mit mehr als einer Logik, die schlüsselt, 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 in den Hinweisen in ConverterParameter. |
FallbackValue | Gibt einen Wert an, der angezeigt werden soll, wenn die Quelle oder der Pfad nicht aufgelöst werden kann. |
Mode | Gibt den Bindungsmodus als eine der folgenden Zeichenfolgen an: "OneTime", "OneWay" oder "TwoWay". Der Standardwert ist "OneTime". Beachten Sie, dass sich dies von der Standardeinstellung für {Binding} unterscheidet, bei der es sich in den meisten Fällen um "OneWay" handelt. |
TargetNullValue | Gibt einen Wert an, der angezeigt werden soll, wenn der Quellwert aufgelöst wird, aber explizit NULL ist. |
BindBack | Gibt eine Funktion an, die für die umgekehrte Richtung einer bidirektionale Bindung verwendet werden soll. |
UpdateSourceTrigger | Gibt an, wann Änderungen vom Steuerelement an das Modell in TwoWay-Bindungen zurückgeschoben 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 bei den Standardwerten für die Mode-Eigenschaft. x:DefaultBindMode kann verwendet werden, um den Standardmodus für x:Bind für ein bestimmtes Segment der Markupstruktur zu ändern. Der ausgewählte Modus wendet alle x:Bind-Ausdrücke auf dieses Element und seine untergeordneten Elemente an, die keinen Modus explizit als Teil der Bindung angeben. OneTime ist leistungsfähiger als OneWay, da die Verwendung von OneWay dazu führt, dass mehr Code generiert wird, um die Änderungserkennung zu verbinden und zu verarbeiten.
Hinweise
Da {x:Bind} generierten Code verwendet, um seine Vorteile zu erzielen, sind zur Kompilierung Typinformationen erforderlich. Dies bedeutet, dass Sie keine Bindung an Eigenschaften vornehmen können, bei denen Sie den Typ nicht vorab kennen. Aus diesem Grund können Sie {x:Bind} nicht mit der DataContext-Eigenschaft verwenden, die vom Typ "Object" ist und zur Laufzeit ebenfalls geändert werden kann.
Wenn Sie {x:Bind} mit Datenvorlagen verwenden, müssen Sie angeben, an den der Typ 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 bei Bedarf Umwandlungen verwenden, um einen vollständigen Ausdruck zu formulieren.
Kompilierte Bindungen hängen von der Codegenerierung ab. Wenn Sie also {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} .
Seiten und Benutzersteuerelemente, die kompilierte Bindungen enthalten, weisen eine "Bindings"-Eigenschaft im generierten Code auf. Dazu gehören folgende Methoden:
- Update() – Dadurch werden die Werte aller kompilierten Bindungen aktualisiert. Alle Uni-/Bidirektionale Bindungen haben die Listener eingebunden, um Änderungen zu erkennen.
- Initialize() – Wenn die Bindungen noch nicht initialisiert wurden, wird Update() aufgerufen, um die Bindungen zu initialisieren.
- StopTracking() – Dadurch werden alle Listener, die für unidirektionale und bidirektionale Bindungen erstellt wurden, entfernt. Sie können mithilfe der Update()-Methode neu initialisiert werden.
Hinweis
Ab Windows 10, Version 1607, bietet das XAML-Framework einen integrierten booleschen zu Visibility-Konverter. Der Konverter ordnet den Wert der Visible-Aufzählung und "false" zu "Collapsed" 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 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 geschweifte Klammer für einen Wert angeben müssen, z. B. in Path oder ConverterParameter, stellen Sie ihm einen umgekehrten Schrägstrich voran: . \{
Schließen Sie alternativ die gesamte Zeichenfolge ein, die die geschweiften Klammern enthält, die in einem sekundären Anführungszeichensatz eingeschlossen werden müssen, z. B ConverterParameter='{Mix}'
. .
Converter, ConverterLanguage und ConverterLanguage beziehen sich alle auf das Szenario der Konvertierung eines Werts oder Typs aus der Bindungsquelle in einen Typ oder Wert, der mit der Bindungszieleigenschaft kompatibel ist. Weitere Informationen und Beispiele finden Sie im Abschnitt "Datenkonvertierungen" der Datenbindung im Detail.
{x:Bind} ist nur eine Markuperweiterung ohne Möglichkeit, solche Bindungen programmgesteuert zu erstellen oder zu bearbeiten. Weitere Informationen zu Markuperweiterungen finden Sie in der XAML-Übersicht.