Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 UntereigenschaftOrder
des Objekts oder der EigenschaftShoppingCart
fest.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 SiePath="[(sys:Int32)42,(sys:Int32)24]"
haben, wobeisys
demSystem
-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 KlauselPath=/
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 eineOffices
Eigenschaft enthält, die auch eine Auflistung ist. Das aktuelle Element ist ein Objekt, das eineManagerName
Eigenschaft enthält.Optional kann ein Punkt (
.
)-Pfad verwendet werden, um eine Bindung an die aktuelle Quelle zu erstellen.Text="{Binding}"
entspricht beispielsweiseText="{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
&
, um das Zeichen "&
" auszublenden.Verwenden Sie
>
, 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äßigen-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
.NET Desktop feedback