Delen via


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 subeigenschap Order van het object of de eigenschap ShoppingCart.

  • 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; bijvoorbeeld Path=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, waarbij sys is toegewezen aan de System 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 een Offices eigenschap bevat die ook een verzameling is. Het huidige item is een object dat een eigenschap ManagerName bevat.

  • U kunt eventueel een puntpad (.) gebruiken om verbinding te maken met de huidige bron. Text="{Binding}" is bijvoorbeeld gelijk aan Text="{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 &amp; om het teken "&" te escapen.

    • Gebruik &gt; 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