Overzicht bindingsdeclaraties
In dit onderwerp worden de verschillende manieren besproken waarop u een binding kunt declareren.
Voorwaarden
Voordat u dit onderwerp leest, is het belangrijk dat u bekend bent met het concept en het gebruik van markeringsextensies. Zie Markup Extensions en WPF XAMLvoor meer informatie over markeringsextensies.
In dit onderwerp worden geen concepten van gegevensbinding behandeld. Zie Overzicht van gegevensbindingvoor een bespreking van concepten van gegevensbindingen.
Een binding declareren in XAML
In deze sectie wordt beschreven hoe u een binding declareert in XAML.
Gebruik van markeringsuitbreidingen
Binding is een markeringsextensie. Wanneer u de bindingsextensie gebruikt om een binding te declareren, bestaat de declaratie uit een reeks componenten na het Binding
trefwoord en gescheiden door komma's (,). De componenten in de bindingsdeclaratie kunnen in elke volgorde staan en er zijn veel mogelijke combinaties. De clausules zijn naam=waarde paren waarin naam de naam is van de eigenschap Binding en waarde de waarde is die u voor de eigenschap instelt.
Wanneer u bindingsdeclaratietekenreeksen in markeringen maakt, moeten deze worden gekoppeld aan de specifieke afhankelijkheidseigenschap van een doelobject. In het volgende voorbeeld ziet u hoe u de eigenschap TextBox.Text verbindt met behulp van de bindingsextensie, waarbij de eigenschappen Source en Path worden opgegeven.
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
U kunt de meeste eigenschappen van de Binding-klasse op deze manier opgeven. Zie het overzicht voor meer informatie over de bindingsextensie en voor een lijst met Binding eigenschappen die niet kunnen worden ingesteld met behulp van de bindingsextensie.
Syntax van objectelementen
De syntaxis van objectelementen is een alternatief voor het maken van de bindingsdeclaratie. In de meeste gevallen is er geen bijzonder voordeel bij het gebruik van de opmaakextensie of de syntaxis van het objectelement. In gevallen waarin de markeringsextensie echter geen ondersteuning biedt voor uw scenario, zoals wanneer uw eigenschapswaarde van een niet-tekenreekstype is waarvoor geen typeconversie bestaat, moet u de syntaxis van het objectelement gebruiken.
Hier volgt een voorbeeld van zowel de syntaxis van het objectelement als het gebruik van de markeringsextensie:
<TextBlock Name="myconvertedtext"
Foreground="{Binding Path=TheDate,
Converter={StaticResource MyConverterReference}}">
<TextBlock.Text>
<Binding Path="TheDate"
Converter="{StaticResource MyConverterReference}"/>
</TextBlock.Text>
</TextBlock>
In het voorbeeld wordt de eigenschap Foreground gekoppeld door een binding te declareren met behulp van de syntaxis van de extensie. De bindingsdeclaratie voor de eigenschap Text maakt gebruik van de syntaxis van het objectelement.
Zie XAML-syntaxis in detailvoor meer informatie over de verschillende termen.
MultiBinding en PriorityBinding
MultiBinding en PriorityBinding bieden geen ondersteuning voor de syntaxis van de XAML-extensie. Daarom moet u de syntaxis van het objectelement gebruiken als u een MultiBinding of een PriorityBinding in XAML declareren.
Een binding maken in code
Een andere manier om een binding op te geven, is door eigenschappen rechtstreeks op een Binding object in code in te stellen. In het volgende voorbeeld ziet u hoe u een Binding-object maakt en de eigenschappen in code opgeeft. In dit voorbeeld is TheConverter
een object dat de IValueConverter-interface implementeert.
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
Als het object dat u bindt een FrameworkElement of een FrameworkContentElement is, kunt u de methode SetBinding
aanroepen in uw object in plaats van BindingOperations.SetBindingte gebruiken. Zie Een binding maken in codevoor een voorbeeld.
De syntaxis van het bindingspad
Gebruik de eigenschap Path om de bronwaarde op te geven waarmee u een binding wilt maken:
In het eenvoudigste geval is de Path eigenschapswaarde de naam van de eigenschap van het bronobject dat moet worden gebruikt voor de binding, zoals
Path=PropertyName
.Subproperties van een eigenschap kunnen worden opgegeven met een vergelijkbare syntaxis als in C#. De component
Path=ShoppingCart.Order
bijvoorbeeld de binding instelt op de subeigenschapOrder
van het object of de eigenschapShoppingCart
.Als u verbinding wilt maken met een gekoppelde eigenschap, plaatst u haakjes rond de gekoppelde eigenschap. Als u bijvoorbeeld wilt binden aan de gekoppelde eigenschap DockPanel.Dock, is de syntaxis
Path=(DockPanel.Dock)
.Indexeerfuncties van een eigenschap kunnen worden opgegeven binnen vierkante haken na de naam van de eigenschap waarop de indexeerfunctie wordt toegepast. De clausule
Path=ShoppingCart[0]
stelt de binding in op de index die overeenkomt met de manier waarop de interne indexering van uw eigenschap de letterlijke reeks "0" verwerkt. Geneste indexeerfuncties worden ook ondersteund.Indexeerfuncties en subproperties kunnen worden gemengd in een
Path
clausule; bijvoorbeeldPath=ShoppingCart.ShippingInfo[MailingAddress,Street].
In indexeerfuncties kunt u meerdere indexeerparameters gescheiden hebben door komma's (,). Het type van elke parameter kan worden opgegeven met haakjes. U kunt bijvoorbeeld
Path="[(sys:Int32)42,(sys:Int32)24]"
hebben, waarbijsys
is toegewezen aan deSystem
naamruimte.Wanneer de bron een verzamelingsweergave is, kan het huidige item worden opgegeven met een slash (/). De clausule
Path=/
stelt bijvoorbeeld de binding in op het huidige item in de weergave. Wanneer de bron een verzameling is, geeft deze syntaxis het huidige item van de standaardverzamelingsweergave op.Eigenschapsnamen en slashes kunnen worden gecombineerd om eigenschappen te verkennen die verzamelingen zijn.
Path=/Offices/ManagerName
geeft bijvoorbeeld het huidige item van de bronverzameling op, dat eenOffices
eigenschap bevat die ook een verzameling is. Het huidige item is een object dat een eigenschapManagerName
bevat.U kunt eventueel een puntpad (.) gebruiken om verbinding te maken met de huidige bron.
Text="{Binding}"
is bijvoorbeeld gelijk aanText="{Binding Path=.}"
.
Mechanisme voor ontsnappen
In indexeerfuncties ([ ]) wordt het volgende teken (^) ontsnapt.
Als u Path instelt in XAML, moet u ook bepaalde tekens escapen (met XML-entiteiten) die speciaal zijn voor de definitie van de XML-taal:
Gebruik
&
om het teken "&" te escapen.Gebruik
>
om te ontsnappen aan de eindtag ">".
Als u bovendien de volledige binding in een kenmerk beschrijft met behulp van de syntaxis van de markeringsextensie, moet u tekens die speciaal zijn voor de WPF-markeringsextensieparser escapen met een backslash (\):
Backslash (\) is het escape-teken zelf.
Het gelijkteken (=) scheidt de eigenschapsnaam van de eigenschapswaarde.
Door komma's (,) worden eigenschappen gescheiden.
De rechter accolade (}) is het einde van een markeringsextensie.
Standaardgedrag
Het standaardgedrag is als volgt als deze niet is opgegeven in de declaratie.
Er wordt een standaardconversieprogramma gemaakt waarmee wordt geprobeerd een typeconversie uit te voeren tussen de bindingsbronwaarde en de doelwaarde van de binding. Als er geen conversie kan worden uitgevoerd, retourneert het standaardconversieprogramma
null
.Als u ConverterCultureniet instelt, gebruikt de bindingsengine de eigenschap
Language
van het doelobject voor de binding. In XAML wordt deze standaard ingesteld op 'en-US' of wordt de waarde overgenomen van het hoofdelement (of een element) van de pagina, als deze expliciet is ingesteld.Zolang de binding al een gegevenscontext heeft (bijvoorbeeld de overgenomen gegevenscontext die afkomstig is van een bovenliggend element) en welk item of welke verzameling dan ook door die context wordt geretourneerd voor binding zonder verdere aanpassing van het pad, kan een bindingsdeclaratie helemaal geen componenten hebben:
{Binding}
Dit is vaak de manier waarop een binding wordt opgegeven voor gegevensopmaak, wanneer de binding op een verzameling handelt. Zie de sectie Volledige objecten die worden gebruikt als een bindingsbron in de Overzicht van bindingsbronnenvoor meer informatie.De Mode varieert tussen eenrichting en tweerichting, afhankelijk van de afhankelijkheidseigenschap die gebonden wordt. U kunt de bindingsmodus altijd expliciet declareren om ervoor te zorgen dat uw binding het gewenste gedrag heeft. Over het algemeen worden besturingselementeigenschappen die door de gebruiker kunnen worden bewerkt, zoals TextBox.Text en RangeBase.Value, standaard ingesteld op tweerichtingsbindingen, terwijl de meeste andere eigenschappen standaard éénrichtingsbindingen hebben.
De standaardwaarde UpdateSourceTrigger varieert tussen PropertyChanged en LostFocus, afhankelijk van de afhankelijke afhankelijkheidseigenschap. De standaardwaarde voor de meeste afhankelijkheidseigenschappen is PropertyChanged, terwijl de eigenschap TextBox.Text een standaardwaarde van LostFocusheeft.
Zie ook
.NET Desktop feedback