Share via


Übersicht über Bindungsdeklarationen

Aktualisiert: September 2010

In diesem Thema werden die verschiedenen Möglichkeiten zum Deklarieren einer Bindung erläutert.

Dieses Thema enthält folgende Abschnitte.

  • Erforderliche Komponenten
  • Deklarieren einer Bindung in XAML
  • Erstellen einer Bindung in Code
  • Bindungspfadsyntax
  • Standardverhalten
  • Verwandte Abschnitte

Erforderliche Komponenten

Bevor Sie dieses Thema lesen, ist es wichtig, dass Sie mit dem Konzept und der Verwendung von Markuperweiterungen vertraut sind. Weitere Informationen über Markuperweiterungen finden Sie unter Markuperweiterungen und WPF-XAML.

In diesem Thema werden keinen Datenbindungskonzepte behandelt. Eine Erörterung der Datenbindungskonzepte finden Sie unter Übersicht über Datenbindung.

Deklarieren einer Bindung in XAML

In diesem Abschnitt wird das Deklarieren einer Bindung in XAML erläutert.

Verwendung von Markuperweiterungen

Binding ist eine Markuperweiterung. Wenn Sie die Bindungserweiterung zum Deklarieren einer Bindung verwenden, besteht die Deklaration aus einer Reihe von Klauseln, die dem Binding-Schlüsselwort folgen und durch Kommas (,) getrennt sind. Die Klauseln in der Bindungsdeklaration können in beliebiger Reihenfolge aufgeführt sein, und es gibt zahlreiche mögliche Kombinationen. Die Klauseln sind Name=Wert-Paare, wobei Name der Name der Binding-Eigenschaft und Wert der Wert ist, den Sie für die Eigenschaft festlegen.

Wenn Bindungsdeklarationszeichenfolgen im Markup erstellt werden, müssen sie an die entsprechende Abhängigkeitseigenschaft eines Zielobjekts angefügt werden. Das folgende Beispiel veranschaulicht, wie die TextBox.Text-Eigenschaft mit der Bindungserweiterung gebunden wird, indem die Eigenschaften Source und Path festgelegt werden.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

Sie können die meisten Eigenschaften der Binding-Klasse auf diese Weise festlegen. Weitere Informationen über die Bindungserweiterung sowie eine Liste mit Binding-Eigenschaften, die nicht mit der Bindungserweiterung festgelegt werden können, finden Sie in der Bindung als Markuperweiterung-Übersicht.

Objektelementsyntax

Die Objektelementsyntax stellt eine Alternative zur Erstellung der Bindungsdeklaration dar. In den meisten Fällen gibt es keinen besonderen Vorteil der Verwendung der Markuperweiterung gegenüber der Objektelementsyntax. In den Fällen, in denen die Markuperweiterung das von Ihnen verwendete Szenario jedoch nicht unterstützt (wenn der Eigenschaftswert zum Beispiel keine Zeichenfolge ist und keine Typkonvertierung hierfür vorhanden ist), müssen Sie die Objektelementsyntax verwenden.

Nachfolgend ist ein Beispiel für die Verwendung der Objektelementsyntax und der Markuperweiterung aufgeführt:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

Im Beispiel wird die Foreground-Eigenschaft gebunden, indem eine Bindung mit der Erweiterungssyntax deklariert wird. Die Bindungsdeklaration für die Text-Eigenschaft verwendet die Objektelementsyntax.

Weitere Informationen zu den unterschiedlichen Begriffen finden Sie unter Ausführliche Erläuterung der XAML-Syntax.

MultiBinding und PriorityBinding

MultiBinding und PriorityBinding unterstützen die XAML-Erweiterungssyntax nicht. Sie müssen daher die Objektelementsyntax verwenden, wenn Sie ein MultiBinding-Element oder ein PriorityBinding-Element in XAML deklarieren.

Erstellen einer Bindung in Code

Eine andere Möglichkeit zum Angeben einer Bindung besteht darin, Eigenschaften für ein Binding-Objekt direkt im Code festzulegen. Das folgende Beispiel zeigt, wie ein Binding-Objekt erstellt und die Eigenschaften im Code angegeben werden. In diesem Beispiel ist TheConverter ein Objekt, das die IValueConverter-Schnittstelle implementiert.

    Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
        ' Make a new source, to grab a new timestamp
        Dim myChangedData As New MyData()

        ' Create a new binding
    ' TheDate is a property of type DateTime on MyData class
        Dim myNewBindDef As New Binding("TheDate")

        myNewBindDef.Mode = BindingMode.OneWay
        myNewBindDef.Source = myChangedData
        myNewBindDef.Converter = TheConverter
        myNewBindDef.ConverterCulture = New CultureInfo("en-US")

    ' myDatetext is a TextBlock object that is the binding target object
        BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
        BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)



...


    End Sub
    private void OnPageLoaded(object sender, EventArgs e)
    {
        // Make a new source, to grab a new timestamp
        MyData myChangedData = new MyData();

        // Create a new binding
    // TheDate is a property of type DateTime on MyData class
        Binding myNewBindDef = new Binding("TheDate");

        myNewBindDef.Mode = BindingMode.OneWay;
        myNewBindDef.Source = myChangedData;
        myNewBindDef.Converter = TheConverter;
        myNewBindDef.ConverterCulture = new CultureInfo("en-US");

    // myDatetext is a TextBlock object that is the binding target object
        BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
        BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);



...


}

Wenn es sich bei dem gebundenen Objekt um ein FrameworkElement oder ein FrameworkContentElement handelt, können Sie die SetBinding-Methode direkt für das Objekt aufrufen, anstatt BindingOperations.SetBinding zu verwenden. Ein Beispiel finden Sie unter Gewusst wie: Erstellen einer Bindung in Code.

Bindungspfadsyntax

Verwenden Sie die Path-Eigenschaft, um den Quellwert anzugeben, an den die Bindung erfolgen soll:

  • Im einfachsten Fall ist der Path-Eigenschaftswert der Name der Eigenschaft des Quellobjekts, das für die Bindung verwendet wird, beispielsweise Path=PropertyName.

  • Untergeordnete Eigenschaften einer Eigenschaft können mit einer ähnlichen Syntax wie in C# angegeben werden. So legt zum Beispiel die Klausel Path=ShoppingCart.Order die Bindung für die untergeordnete Order-Eigenschaft des Objekts oder die ShoppingCart-Eigenschaft fest.

  • Um eine angefügte Eigenschaft zu binden, schließen Sie die angefügte Eigenschaft in Klammern ein. Zum Binden an die angefügte Eigenschaft DockPanel.Dock lautet die Syntax beispielsweise Path=(DockPanel.Dock).

  • Indexer einer Eigenschaft können in eckigen Klammern nach dem Eigenschaftennamen angegeben werden, auf den der Indexer angewendet wird. So legt zum Beispiel die Path=ShoppingCart[0]-Klausel die Bindung auf den Index fest, der der Art und Weise entspricht, wie die interne Indexierung der Eigenschaft das Zeichenfolgenliteral "0" handhabt. Geschachtelte Indexer werden ebenfalls unterstützt.

  • Indexer und untergeordnete Eigenschaften können in einer Path-Klausel kombiniert werden, z. B. Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Indexer können mehrere Indexerparameter enthalten, die durch Kommas (,) getrennt sind. Der Typ der einzelnen Parameter kann in Klammern angegeben werden. Sie können beispielsweise über Path="[(sys:Int32)42,(sys:Int32)24]" verfügen, wobei sys dem System-Namespace zugeordnet ist.

  • Wenn die Quelle eine Auflistungsansicht darstellt, kann das aktuelle Element mit einem Schrägstrich (/) angegeben werden. Beispielsweise legt die Klausel Path=/ die Bindung auf das aktuelle Element in der Ansicht fest. Wenn die Quelle eine Auflistung darstellt, gibt diese Syntax das aktuelle Element der Standardauflistungsansicht an.

  • Eigenschaftennamen und Schrägstriche können kombiniert werden, um Eigenschaften zu durchlaufen, die Auflistungen darstellen. Beispielsweise gibt Path=/Offices/ManagerName das aktuelle Element der Quellauflistung an, die eine Offices-Eigenschaft enthält, bei der es sich ebenfalls um eine Auflistung handelt. Bei dem aktuellen Element handelt es sich um ein Objekt, das eine ManagerName-Eigenschaft enthält.

  • Optional kann ein Pfad mit einem Punkt (.) für die Bindung an die aktuelle Quelle verwendet werden. Text="{Binding}" entspricht beispielsweise Text="{Binding Path=.}".

Mechanismus zum Verwenden von Escapezeichen

  • In Indexern ([ ]) Indexern dient das Caretzeichen (^) als Ecsapezeichen für das nächste Zeichen.

  • Wenn Sie die Path-Eigenschaft in XAML festlegen, müssen Sie auch bestimmte Zeichen (mit XML-Entitäten), die speziell von der XML-Sprachdefinitionen verwendet werden, mit Escapezeichen versehen:

    • Verwenden Sie &amp;, um das Zeichen "&" mit Escapezeichen zu versehen.

    • Verwenden Sie &gt;, um das Endtag ">" mit Escapezeichen zu versehen.

  • Darüber hinaus müssen Sie, wenn Sie die gesamte Bindung in einem Attribut mit der Markuperweiterungssyntax beschreiben, Zeichen (mit einem umgekehrten Schrägstrich \) mit Escapezeichen zu versehen, die speziell vom WPF-Markuperweiterungsparser verwendet werden:

    • Der umgekehrte Schrägstrich (\) ist das eigentliche Escapezeichen.

    • Das Gleichheitszeichen (=) trennt den Eigenschaftennamen vom Eigenschaftswert.

    • Ein Komma (,) trennt Eigenschaften.

    • Die rechte geschweifte Klammer (}) gibt das Ende einer Markuperweiterung an.

Standardverhalten

Das Standardverhalten ist das wie folgt angegebene Verhalten, wenn nicht anders in der Deklaration angegeben.

  • Es wird ein Standardkonverter erstellt, der versucht, eine Typkonvertierung zwischen dem Wert der Bindungsquelle und dem Wert des Bindungsziels durchzuführen. Wenn keine Konvertierung durchgeführt werden kann, gibt der Standardkonverter null zurück.

  • Wenn Sie ConverterCulture nicht festlegen, verwendet das Bindungsmodul die Language-Eigenschaft des Bindungsziel-Objekts. In XAML ist der Standardwert "en-US", oder der Wert wird vom Stammelement (oder einem beliebigen Element) der Seite übernommen, wenn ein Element explizit festgelegt wurde.

  • Solange die Bindung bereits über einen Datenkontext verfügt (z. B. den übernommenen Datenkontext eines übergeordneten Elements) und das von diesem Kontext zurückgegebene Element oder die Auflistung für die Bindung geeignet ist, ohne dass eine weitere Pfadänderung notwendig ist, kann eine Bindung auch über keine Klauseln verfügen: {Binding}. Dies ist häufig der Fall, wenn eine Bindung für die Datenformatierung festgelegt wird, wobei die Bindung auf eine Auflistung angewendet wird. Weitere Informationen finden Sie im Abschnitt "Als Bindungsquelle verwendete ganze Objekte" unter Übersicht über Bindungsquellen.

  • Der standardmäßige Mode wechselt zwischen unidirektional und bidirektional für die gebundene Abhängigkeitseigenschaft. Sie können den Bindungsmodus immer explizit deklarieren, um sicherzustellen, dass die Bindung das gewünschte Verhalten aufweist. Im Allgemeinen sind vom Benutzer bearbeitbare Steuerelementeigenschaften, wie z. B. TextBox.Text und RangeBase.Value, standardmäßig bidirektionale Bindungen, wohingegen die meisten anderen Eigenschaften standardmäßig unidirektionale Bindungen sind.

  • Der standardmäßige UpdateSourceTrigger-Wert variiert zwischen PropertyChanged und LostFocus, was auch von der gebundenen Abhängigkeitseigenschaft abhängt. Der Standardwert für die meisten Abhängigkeitseigenschaften lautet PropertyChanged, während die TextBox.Text-Eigenschaft den Standardwert LostFocus aufweist.

Siehe auch

Referenz

XAML-Syntax von PropertyPath

Konzepte

Übersicht über Datenbindung

Optimieren der Leistung: Datenbindung

Weitere Ressourcen

Gewusst-wie-Themen zur Datenbindung

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

September 2010

TheConverter wurde unter "Erstellen einer Bindung in Code" erläutert.

Kundenfeedback.