Freigeben über


Was sind Bindungsdeklarationen?

In der Regel deklarieren Entwickler die Bindungen direkt im XAML-Markup der UI-Elemente, an die sie Daten binden möchten. Sie können jedoch auch Bindungen im Code deklarieren. In diesem Artikel wird beschrieben, wie Bindungen sowohl in XAML als auch im Code deklariert werden.

Voraussetzungen

Bevor Sie diesen Artikel lesen, ist es wichtig, dass Sie mit dem Konzept und der Verwendung von Markuperweiterungen vertraut sind. Weitere Informationen zu Markuperweiterungen finden Sie unter Markuperweiterungen und WPF-XAML.

In diesem Artikel werden keine Datenbindungskonzepte behandelt. Eine Erläuterung der Datenbindungskonzepte finden Sie unter "Übersicht über die Datenbindung".

Deklarieren einer Bindung in XAML

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

Beim Erstellen von Bindungsdeklarationszeichenfolgen im Markup müssen sie an die spezifische Abhängigkeitseigenschaft eines Zielobjekts angefügt werden. Das folgende Beispiel zeigt, wie die TextBox.Text-Eigenschaft mithilfe der Bindungserweiterung gebunden und die Source- und Path-Eigenschaften angegeben werden.

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

Im vorherigen Beispiel wird ein einfacher Datentyp des Objekttyps Person verwendet. Der folgende Codeausschnitt ist der Code für dieses Objekt:

class Person
{
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
Public Class Person

    Public Property Name As String
    Public Property Birthdate As DateTime
    
End Class

Sie können die meisten Eigenschaften der Binding Klasse auf diese Weise angeben. Weitere Informationen zur Bindungserweiterung und für eine Liste von Eigenschaften, die nicht mithilfe der Binding Bindungserweiterung festgelegt werden können, finden Sie in der Übersicht über die Binding Markup Extension (.NET Framework).

Ein Beispiel zum Erstellen einer Bindung in XAML finden Sie unter Erstellen einer Datenbindung.

Objektelementsyntax

Objektelementsyntax ist eine Alternative zum Erstellen der Bindungsdeklaration. In den meisten Fällen gibt es keinen besonderen Vorteil, entweder die Markuperweiterung oder die Objektelementsyntax zu verwenden. Wenn die Markuperweiterung Ihr Szenario jedoch nicht unterstützt, z. B. wenn ihr Eigenschaftswert einen Nicht-Zeichenfolgentyp aufweist, für den keine Typkonvertierung vorhanden ist, müssen Sie die Objektelementsyntax verwenden.

Im vorherigen Abschnitt wurde gezeigt, wie eine Bindung mit einer XAML-Erweiterung ausgeführt wird. Im folgenden Beispiel wird die gleiche Bindung veranschaulicht, aber objektelementsyntax verwendet:

<TextBlock>
    <TextBlock.Text>
        <Binding Source="{StaticResource myDataSource}" Path="Name"/>
    </TextBlock.Text>
</TextBlock>

Weitere Informationen zu den verschiedenen Begriffen finden Sie unter XAML-Syntax im Detail (.NET Framework).For more information about the different terms, see XAML Syntax In Detail (.NET Framework).

MultiBinding und PriorityBinding

MultiBinding und PriorityBinding unterstützen die XAML-Erweiterungssyntax nicht. Aus diesem Grund müssen Sie die Objektelementsyntax verwenden, wenn Sie ein MultiBinding oder ein PriorityBinding XAML-Code deklarieren.

Erstellen einer Bindung im Code

Eine weitere Möglichkeit zum Angeben einer Bindung besteht darin, Eigenschaften direkt für ein Binding Objekt im Code festzulegen und dann die Bindung einer Eigenschaft zuzuweisen. Das folgende Beispiel zeigt, wie ein Binding Objekt im Code erstellt wird.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // Make a new data source object
    var personDetails = new Person()
    {
        Name = "John",
        Birthdate = DateTime.Parse("2001-02-03")
    };

    // New binding object using the path of 'Name' for whatever source object is used
    var nameBindingObject = new Binding("Name");

    // Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay;
    nameBindingObject.Source = personDetails;
    nameBindingObject.Converter = NameConverter.Instance;
    nameBindingObject.ConverterCulture = new CultureInfo("en-US");

    // Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)

    ' Make a new data source object
    Dim personDetails As New Person() With {
        .Name = "John",
        .Birthdate = Date.Parse("2001-02-03")
    }

    ' New binding object using the path of 'Name' for whatever source object is used
    Dim nameBindingObject As New Binding("Name")

    ' Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay
    nameBindingObject.Source = personDetails
    nameBindingObject.Converter = NameConverter.Instance
    nameBindingObject.ConverterCulture = New CultureInfo("en-US")

    ' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)

End Sub

Der vorherige Code legt Folgendes für die Bindung fest:

  • Der Pfad einer Eigenschaft des Datenquellenobjekts.
  • Der Modus der Bindung.
  • Die Datenquelle, in diesem Fall, eine einfache Objektinstanz, die eine Person darstellt.
  • Ein optionaler Konverter, der den Wert verarbeitet, der aus dem Datenquellenobjekt stammt, bevor er der Zieleigenschaft zugewiesen wird.

Wenn es sich bei dem Objekt, das Sie binden, um ein FrameworkElement oder ein FrameworkContentElement Objekt handelt, können Sie die SetBinding Methode für das Objekt direkt aufrufen, anstatt BindingOperations.SetBinding zu verwenden. Ein Beispiel finden Sie unter How to: Create a Binding in Code.

Im vorherigen Beispiel wird ein einfacher Datentyp des Objekttyps Person verwendet. Im Folgenden sehen Sie den Code für dieses Objekt:

class Person
{
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
Public Class Person

    Public Property Name As String
    Public Property Birthdate As DateTime
    
End Class

Bindungspfadsyntax

Verwenden Sie die Path Eigenschaft, um den Quellwert anzugeben, an den Sie eine Bindung herstellen möchten:

  • Im einfachsten Fall ist der Eigenschaftswert der Name der Eigenschaft des Quellobjekts, das für die Bindung verwendet werden soll, z. B. Path.

  • Untereigenschaften einer Eigenschaft können durch eine ähnliche Syntax wie in C# angegeben werden. Beispielsweise legt die Klausel Path=ShoppingCart.Order die Bindung auf die Untereigenschaft Order des Objekts oder der Eigenschaft ShoppingCartfest.

  • Zum Binden an eine angefügte Eigenschaft platzieren Sie Klammern um die angefügte Eigenschaft. Um beispielsweise eine Bindung an die angefügte Eigenschaft DockPanel.Dockzu erstellen, lautet Path=(DockPanel.Dock)die Syntax .

  • Indexer einer Eigenschaft können in eckigen Klammern nach dem Eigenschaftennamen angegeben werden, auf den der Indexer angewendet wird. Beispielsweise legt die Klausel Path=ShoppingCart[0] die Bindung an den Index fest, der der Art und Weise entspricht, wie Ihre interne Indizierung die literale Zeichenfolge "0" handhabt. Geschachtelte Indexer werden ebenfalls unterstützt.

  • Indexer und Untereigenschaften können in einer Path Klausel gemischt werden, z. B. Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Innerhalb von Indexern. Sie können mehrere Indexerparameter durch Kommas (,) getrennt haben. Der Typ der einzelnen Parameter kann mit Klammern angegeben werden. Zum Beispiel können Sie Path="[(sys:Int32)42,(sys:Int32)24]" haben, wobei sys dem System-Namespace zugeordnet ist.

  • Wenn es sich bei der Quelle um eine Sammlungsansicht handelt, 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 es sich bei der Quelle um eine Auflistung handelt, gibt diese Syntax das aktuelle Element der Standardauflistungsansicht an.

  • Eigenschaftennamen und Schrägstriche können kombiniert werden, um Eigenschaften zu durchlaufen, die Auflistungen sind. Gibt beispielsweise Path=/Offices/ManagerName das aktuelle Element der Quellauflistung an, das eine Offices Eigenschaft enthält, die auch eine Auflistung ist. Das aktuelle Element ist ein Objekt, das eine ManagerName Eigenschaft enthält.

  • Optional kann ein Punkt (.)-Pfad verwendet werden, um eine Bindung an die aktuelle Quelle zu erstellen. Text="{Binding}" entspricht beispielsweise Text="{Binding Path=.}".

Fluchtmechanismus

  • Innerhalb von Indexern ([ ]) wird das Caretzeichen (^) verwendet, um das nächste Zeichen zu maskieren.

  • Wenn Sie Path in XAML festlegen, müssen Sie auch bestimmte Zeichen mit XML-Entitäten escapen, die für die XML-Sprachdefinition spezifisch sind.

    • Verwenden Sie &amp;, um das Zeichen "&" auszublenden.

    • Verwenden Sie &gt;, um den Endtag ">" zu umgehen.

  • Zusätzlich müssen Sie, wenn Sie die gesamte Bindung in einem Attribut mithilfe der Markuperweiterungssyntax beschreiben, Zeichen, die speziell für den WPF-Markuperweiterungsparser sind, mit einem umgekehrten Schrägstrich (\) maskieren:

    • Umgekehrter Schrägstrich (\) ist das Escapezeichen selbst.

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

    • Komma (,) trennt Eigenschaften.

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

Bindungsrichtung

Verwenden Sie die Binding.Mode Eigenschaft, um die Richtung der Bindung anzugeben. Die folgenden Modi sind die verfügbaren Optionen für Bindungsupdates:

Bindungsmodus BESCHREIBUNG
BindingMode.TwoWay Aktualisiert die Zieleigenschaft oder die Eigenschaft, wenn sich entweder die Zieleigenschaft oder die Quelleigenschaft ändert.
BindingMode.OneWay Aktualisiert die Zieleigenschaft nur, wenn sich die Quelleigenschaft ändert.
BindingMode.OneTime Aktualisiert die Zieleigenschaft nur, wenn die Anwendung gestartet wird oder wenn eine Änderung an DataContext erfolgt.
BindingMode.OneWayToSource Aktualisiert die Quelleigenschaft, wenn sich die Zieleigenschaft ändert.
BindingMode.Default Bewirkt, dass der Standardwert Mode der Zieleigenschaft verwendet wird.

Weitere Informationen finden Sie unter der BindingMode-Enumeration.

Das folgende Beispiel zeigt, wie die Mode Eigenschaft festgelegt wird:

<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />

Um Quelländerungen zu erkennen (gilt für OneWay und TwoWay Bindungen), muss die Quelle einen geeigneten Mechanismus für Eigenschaftenänderungsbenachrichtigungen implementieren, z.B. INotifyPropertyChanged. Weitere Informationen finden Sie unter Bereitstellen von Änderungsbenachrichtigungen.

Für TwoWay- oder OneWayToSource-Bindungen können Sie den Zeitpunkt der Quellaktualisierungen steuern, indem Sie die UpdateSourceTrigger-Eigenschaft festlegen. Weitere Informationen finden Sie unter UpdateSourceTrigger.

Standardverhalten

Das Standardverhalten lautet wie folgt, wenn sie in der Deklaration nicht angegeben ist:

  • Es wird ein Standardkonverter erstellt, der versucht, eine Typkonvertierung zwischen dem Bindungsquellwert und dem Bindungszielwert auszuführen. Wenn keine Konvertierung vorgenommen werden kann, wird der Standardkonverter zurückgegeben null.

  • Wenn Sie nicht festlegen ConverterCulture, verwendet das Bindungsmodul die Language Eigenschaft des Bindungszielobjekts. In XAML wird standardmäßig en-US gesetzt oder der Wert vom Stammelement (oder einem anderen Element) der Seite übernommen, vorausgesetzt, der Wert wurde explizit festgelegt.

  • Solange die Bindung bereits über einen Datenkontext verfügt (z. B. den geerbten Datenkontext, der von einem übergeordneten Element stammt), und das Element oder die Sammlung, die von diesem Kontext zurückgegeben wird, für die Bindung geeignet ist, ohne dass eine weitere Pfadänderung erforderlich ist, muss die Bindungserklärung keine Klauseln enthalten: {Binding}. Dies ist häufig die Methode, mit der eine Bindung für die Datenstilisierung spezifiziert wird, wobei die Bindung auf eine Sammlung angewendet wird. Weitere Informationen finden Sie unter Verwenden von gesamten Objekten als Bindungsquelle.

  • Der Standard Mode variiert abhängig von der gebundenen Abhängigkeitseigenschaft zwischen Einwegbindung und Zweiwegbindung. Sie können den Bindungsmodus immer explizit deklarieren, um sicherzustellen, dass die Bindung das gewünschte Verhalten aufweist. Im Allgemeinen sind bearbeitbare Steuerelementeigenschaften wie TextBox.Text und RangeBase.Value standardmäßig auf bidirektionale Bindungen eingestellt, während die meisten anderen Eigenschaften standardmäßig unidirektionale Bindungen verwenden.

  • Der Standardwert UpdateSourceTrigger variiert auch zwischen PropertyChanged und LostFocus je nach gebundener Abhängigkeitseigenschaft. Der Standardwert für die meisten Abhängigkeitseigenschaften lautet PropertyChanged, während die TextBox.Text Eigenschaft einen Standardwert aufweist LostFocus.

Siehe auch