Übersicht über BindungsdeklarationenBinding Declarations Overview

In diesem Thema werden die verschiedenen Möglichkeiten zum Deklarieren einer Bindung erläutert.This topic discusses the different ways you can declare a binding.

VoraussetzungenPrerequisites

Bevor Sie dieses Thema lesen, ist es wichtig, dass Sie mit dem Konzept und der Verwendung von Markuperweiterungen vertraut sind.Before reading this topic, it is important that you are familiar with the concept and usage of markup extensions. Weitere Informationen über Markuperweiterungen finden Sie unter Markuperweiterungen und WPF XAML.For more information about markup extensions, see Markup Extensions and WPF XAML.

In diesem Thema werden keinen Datenbindungskonzepte behandelt.This topic does not cover data binding concepts. Eine Erörterung der Datenbindungskonzepte finden Sie in der Übersicht über die Datenbindung.For a discussion of data binding concepts, see Data Binding Overview.

Deklarieren einer Bindung in XAMLDeclaring a Binding in XAML

In diesem Abschnitt wird das Deklarieren einer Bindung in XAML erläutert.This section discusses how to declare a binding in XAML.

Verwendung von MarkuperweiterungenMarkup Extension Usage

Binding ist eine Markuperweiterung.Binding is a markup extension. 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.When you use the binding extension to declare a binding, the declaration consists of a series of clauses following the Binding keyword and separated by commas (,). Die Klauseln in der Bindungsdeklaration können in beliebiger Reihenfolge aufgeführt sein, und es gibt zahlreiche mögliche Kombinationen.The clauses in the binding declaration can be in any order and there are many possible combinations. Die-Klauseln sind Name- = Wert -Paare, wobei Name der Name der Binding Eigenschaft und value der Wert ist, den Sie für die Eigenschaft festlegen.The clauses are Name=Value pairs where Name is the name of the Binding property and Value is the value you are setting for the property.

Wenn Bindungsdeklarationszeichenfolgen im Markup erstellt werden, müssen sie an die entsprechende Abhängigkeitseigenschaft eines Zielobjekts angefügt werden.When creating binding declaration strings in markup, they must be attached to the specific dependency property of a target object. Im folgenden Beispiel wird gezeigt, wie die TextBox.Text -Eigenschaft mithilfe der Bindungs Erweiterung gebunden wird und die-Eigenschaft und die-Eigenschaft angegeben werden Source Path .The following example shows how to bind the TextBox.Text property using the binding extension, specifying the Source and Path properties.

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

Auf diese Weise können Sie die meisten Eigenschaften der Binding Klasse angeben.You can specify most of the properties of the Binding class this way. Weitere Informationen zur Bindungs Erweiterung sowie eine Liste der Eigenschaften, die Binding nicht mit der Bindungs Erweiterung festgelegt werden können, finden Sie in der Übersicht über die Bindungs Markup Erweiterung .For more information about the binding extension as well as for a list of Binding properties that cannot be set using the binding extension, see the Binding Markup Extension overview.

ObjektelementsyntaxObject Element Syntax

Die Objektelementsyntax stellt eine Alternative zur Erstellung der Bindungsdeklaration dar.Object element syntax is an alternative to creating the binding declaration. In den meisten Fällen gibt es keinen besonderen Vorteil der Verwendung der Markuperweiterung gegenüber der Objektelementsyntax.In most cases, there is no particular advantage to using either the markup extension or the object element syntax. 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.However, in cases which the markup extension does not support your scenario, such as when your property value is of a non-string type for which no type conversion exists, you need to use the object element syntax.

Nachfolgend ist ein Beispiel für die Verwendung der Objektelementsyntax und der Markuperweiterung aufgeführt:The following is an example of both the object element syntax and the markup extension usage:

<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 mithilfe der Erweiterungs Syntax deklariert wird.The example binds the Foreground property by declaring a binding using the extension syntax. Die Bindungs Deklaration für die- Text Eigenschaft verwendet die Objekt Element Syntax.The binding declaration for the Text property uses the object element syntax.

Weitere Informationen zu den unterschiedlichen Begriffen finden Sie unter Ausführliche Erläuterung der XAML-Syntax.For more information about the different terms, see XAML Syntax In Detail.

MultiBinding und PriorityBindingMultiBinding and PriorityBinding

MultiBindingund PriorityBinding unterstützen die XAML-Erweiterungs Syntax nicht.MultiBinding and PriorityBinding do not support the XAML extension syntax. Daher müssen Sie die Objekt Element Syntax verwenden, wenn Sie eine MultiBinding oder eine PriorityBinding in XAML deklarieren.Therefore, you must use the object element syntax if you are declaring a MultiBinding or a PriorityBinding in XAML.

Erstellen einer Bindung in CodeCreating a Binding in Code

Eine andere Möglichkeit, eine Bindung anzugeben, besteht darin, Eigenschaften direkt für ein- Binding Objekt im Code festzulegen.Another way to specify a binding is to set properties directly on a Binding object in code. Im folgenden Beispiel wird gezeigt, wie ein Binding -Objekt erstellt und die Eigenschaften im Code angegeben werden.The following example shows how to create a Binding object and specify the properties in code. In diesem Beispiel TheConverter ist ein Objekt, das die- IValueConverter Schnittstelle implementiert.In this example, TheConverter is an object that implements the IValueConverter interface.

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);

    lbChooseCulture.SelectedIndex = 0;
}
 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)

     lbChooseCulture.SelectedIndex = 0
 End Sub

Wenn das Objekt, das Sie binden, ein FrameworkElement oder ein ist, FrameworkContentElement können Sie die- SetBinding Methode für das-Objekt direkt anstelle von verwenden BindingOperations.SetBinding .If the object you are binding is a FrameworkElement or a FrameworkContentElement you can call the SetBinding method on your object directly instead of using BindingOperations.SetBinding. Ein Beispiel finden Sie unter Erstellen einer Bindung in Code.For an example, see Create a Binding in Code.

BindungspfadsyntaxBinding Path Syntax

Verwenden Sie die- Path Eigenschaft, um den Quellwert anzugeben, an den Sie binden möchten:Use the Path property to specify the source value you want to bind to:

  • Im einfachsten Fall Path ist der Eigenschafts Wert der Name der Eigenschaft des Quell Objekts, das für die Bindung verwendet werden soll, z Path=PropertyName . b..In the simplest case, the Path property value is the name of the property of the source object to use for the binding, such as Path=PropertyName.

  • Unter Eigenschaften einer Eigenschaft können mit einer ähnlichen Syntax wie in c# angegeben werden.Subproperties of a property can be specified by a similar syntax as in C#. So legt zum Beispiel die Klausel Path=ShoppingCart.Order die Bindung für die untergeordnete Order-Eigenschaft des Objekts oder die ShoppingCart-Eigenschaft fest.For instance, the clause Path=ShoppingCart.Order sets the binding to the subproperty Order of the object or property ShoppingCart.

  • Um eine angefügte Eigenschaft zu binden, schließen Sie die angefügte Eigenschaft in Klammern ein.To bind to an attached property, place parentheses around the attached property. Um z. b. an die angefügte-Eigenschaft zu binden DockPanel.Dock , ist die Syntax Path=(DockPanel.Dock) .For example, to bind to the attached property DockPanel.Dock, the syntax is Path=(DockPanel.Dock).

  • Indexer einer Eigenschaft können durch eckige Klammern nach dem Namen der indizierten Eigenschaft angegeben werden.Indexers of a property can be specified within square brackets following the property name where the indexer is applied. So legt zum Beispiel die Path=ShoppingCart[0]-Klausel die Bindung auf den Index fest, der der Art und Weise entspricht, wie die interne Indizierung der Eigenschaft das Zeichenfolgenliteral „0“ handhabt.For instance, the clause Path=ShoppingCart[0] sets the binding to the index that corresponds to how your property's internal indexing handles the literal string "0". Geschachtelte Indexer werden ebenfalls unterstützt.Nested indexers are also supported.

  • Indexer und untergeordnete Eigenschaften können in einer Path-Klausel kombiniert werden, z. B. Path=ShoppingCart.ShippingInfo[MailingAddress,Street]..Indexers and subproperties can be mixed in a Path clause; for example, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Indexer können mehrere durch Kommata (,) getrennte Indexer-Parameter aufweisen.Inside indexers you can have multiple indexer parameters separated by commas (,). Der Typ der einzelnen Parameter kann in Klammern angegeben werden.The type of each parameter can be specified with parentheses. Sie können beispielsweise über Path="[(sys:Int32)42,(sys:Int32)24]" verfügen, wobei sys dem System-Namespace zugeordnet ist.For example, you can have Path="[(sys:Int32)42,(sys:Int32)24]", where sys is mapped to the System namespace.

  • Wenn die Quelle eine Auflistungsansicht darstellt, kann das aktuelle Element mit einem Schrägstrich (/) angegeben werden.When the source is a collection view, the current item can be specified with a slash (/). Beispielsweise legt die Klausel Path=/ die Bindung auf das aktuelle Element in der Ansicht fest.For example, the clause Path=/ sets the binding to the current item in the view. Wenn die Quelle eine Auflistung darstellt, gibt diese Syntax das aktuelle Element der Standardauflistungsansicht an.When the source is a collection, this syntax specifies the current item of the default collection view.

  • Eigenschaftennamen und Schrägstriche können kombiniert werden, um Eigenschaften zu durchlaufen, die Auflistungen darstellen.Property names and slashes can be combined to traverse properties that are collections. 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.For example, Path=/Offices/ManagerName specifies the current item of the source collection, which contains an Offices property that is also a collection. Bei dem aktuellen Element handelt es sich um ein Objekt, das eine ManagerName-Eigenschaft enthält.Its current item is an object that contains a ManagerName property.

  • Optional kann ein Pfad mit einem Punkt (.) für die Bindung an die aktuelle Quelle verwendet werden.Optionally, a period (.) path can be used to bind to the current source. Text="{Binding}" entspricht beispielsweise Text="{Binding Path=.}".For example, Text="{Binding}" is equivalent to Text="{Binding Path=.}".

Mechanismus zum Verwenden von EscapezeichenEscaping Mechanism

  • In Indexern ([ ]) dient das Caretzeichen (^) als Escapezeichen für das nächste Zeichen.Inside indexers ([ ]), the caret character (^) escapes the next character.

  • Wenn Sie Path in XAML festlegen, müssen Sie auch eine Escapezeichen (mit XML-Entitäten) für bestimmte Sonderzeichen in der XML-Sprachdefinition verwenden:If you set Path in XAML, you also need to escape (using XML entities) certain characters that are special to the XML language definition:

    • Verwenden Sie &amp;, um das Zeichen „&“ mit Escapezeichen zu versehen.Use &amp; to escape the character "&".

    • Verwenden Sie &gt;, um das Endtag „>“ mit Escapezeichen zu versehen.Use &gt; to escape the end tag ">".

  • 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 WPFWPF-Markuperweiterungsparser verwendet werden:Additionally, if you describe the entire binding in an attribute using the markup extension syntax, you need to escape (using backslash \) characters that are special to the WPFWPF markup extension parser:

    • Der umgekehrte Schrägstrich (\) ist das eigentliche Escapezeichen.Backslash (\) is the escape character itself.

    • Das Gleichheitszeichen (=) trennt den Eigenschaftennamen vom Eigenschaftswert.The equal sign (=) separates property name from property value.

    • Ein Komma (,) trennt Eigenschaften.Comma (,) separates properties.

    • Die rechte geschweifte Klammer (}) gibt das Ende einer Markuperweiterung an.The right curly brace (}) is the end of a markup extension.

StandardverhaltenDefault Behaviors

Das Standardverhalten ist das wie folgt angegebene Verhalten, wenn nicht anders in der Deklaration angegeben.The default behavior is as follows if not specified in the declaration.

  • Es wird ein Standardkonverter erstellt, der versucht, eine Typkonvertierung zwischen dem Wert der Bindungsquelle und dem Wert des Bindungsziels durchzuführen.A default converter is created that tries to do a type conversion between the binding source value and the binding target value. Wenn keine Konvertierung durchgeführt werden kann, gibt der Standardkonverter null zurück.If a conversion cannot be made, the default converter returns null.

  • Wenn Sie nicht festlegen ConverterCulture , verwendet die Bindungs-Engine die- Language Eigenschaft des Bindungs Zielobjekts.If you do not set ConverterCulture, the binding engine uses the Language property of the binding target object. 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.In XAML, this defaults to "en-US" or inherits the value from the root element (or any element) of the page, if one has been explicitly set.

  • 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.As long as the binding already has a data context (for instance, the inherited data context coming from a parent element), and whatever item or collection being returned by that context is appropriate for binding without requiring further path modification, a binding declaration can have no clauses at all: {Binding} This is often the way a binding is specified for data styling, where the binding acts upon a collection. Weitere Informationen finden Sie im Abschnitt „Als Bindungsquelle verwendete ganze Objekte“ in der Übersicht über Bindungsquellen.For more information, see the "Entire Objects Used as a Binding Source" section in the Binding Sources Overview.

  • Der Standardwert Mode variiert je nach Abhängigkeits Eigenschaft, die gebunden wird, zwischen unidirektionaler und bidirektional.The default Mode varies between one-way and two-way depending on the dependency property that is being bound. Sie können den Bindungsmodus immer explizit deklarieren, um sicherzustellen, dass die Bindung das gewünschte Verhalten aufweist.You can always declare the binding mode explicitly to ensure that your binding has the desired behavior. Im Allgemeinen werden von Benutzern bearbeitbare Steuerelement Eigenschaften, z. b. TextBox.Text und, standardmäßig bidirektionale RangeBase.Value Bindungen, wohingegen die meisten anderen Eigenschaften standardmäßig unidirektionale Bindungen haben.In general, user-editable control properties, such as TextBox.Text and RangeBase.Value, default to two-way bindings, whereas most other properties default to one-way bindings.

  • Der Standard UpdateSourceTrigger Wert variiert PropertyChanged je nach LostFocus der gebundenen Abhängigkeits Eigenschaft auch zwischen und.The default UpdateSourceTrigger value varies between PropertyChanged and LostFocus depending on the bound dependency property as well. Der Standardwert für die meisten Abhängigkeitseigenschaften ist PropertyChanged, während die TextBox.Text-Eigenschaft den Standardwert LostFocus aufweist.The default value for most dependency properties is PropertyChanged, while the TextBox.Text property has a default value of LostFocus.

Weitere InformationenSee also