Delen via


Wat zijn bindingsdeclaraties?

Normaal gesproken declareren ontwikkelaars de bindingen rechtstreeks in de XAML-opmaak van de UI-elementen waaraan ze gegevens willen binden. U kunt echter ook bindingen declareren in code. In dit artikel wordt beschreven hoe u bindingen declareert in zowel XAML als in code.

Vereiste voorwaarden

Voordat u dit artikel 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 artikel worden geen concepten van gegevensbinding behandeld. Zie Het overzicht van gegevensbindingen voor een bespreking van concepten van gegevensbinding.

Een binding declareren in XAML

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 componenten zijnnaam-waardeparen=, waarbij Naam de naam is van de Binding eigenschap 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=Name}"/>

In het vorige voorbeeld wordt een eenvoudig type gegevensobject van Person gebruikt. Het volgende codefragment is de code voor dat object:

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

U kunt de meeste eigenschappen van de Binding-klasse op deze manier opgeven. Zie het overzicht van de bindingsextensie Binding voor meer informatie over de bindingsextensie en voor een lijst met eigenschappen die niet kunnen worden ingesteld met behulp van de bindingsextensie.

Zie Een gegevensbinding maken voor een voorbeeld van het maken van een binding in XAML.

De syntaxis 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. Als de markeringsextensie echter geen ondersteuning biedt voor uw scenario, zoals wanneer de eigenschapswaarde van een niet-tekenreekstype is waarvoor geen typeconversie bestaat, moet u de syntaxis van het objectelement gebruiken.

In de vorige sectie werd gedemonstreerd hoe u verbinding kunt maken met een XAML-extensie. In het volgende voorbeeld ziet u hoe u dezelfde binding uitvoert, maar de syntaxis van het objectelement gebruikt:

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

Zie XAML-syntaxis in detail (.NET Framework) voor meer informatie over de verschillende termen.

MultiBinding en PriorityBinding

MultiBinding en PriorityBinding biedt 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 declareert.

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 en vervolgens de binding toe te wijzen aan een eigenschap. In het volgende voorbeeld ziet u hoe u een Binding object maakt in code.

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

De vorige code stelt het volgende in voor de binding:

  • Een pad van de eigenschap op het gegevensbronobject.
  • De modus van de binding.
  • De gegevensbron, in dit geval, een eenvoudig objectexemplaar dat een persoon vertegenwoordigt.
  • Een optioneel conversieprogramma dat de waarde verwerkt die afkomstig is van het gegevensbronobject voordat deze wordt toegewezen aan de doeleigenschap.

Wanneer het object dat u bindt een FrameworkElement of een FrameworkContentElementis, kunt u de SetBinding methode rechtstreeks in uw object aanroepen in plaats van te gebruiken BindingOperations.SetBinding. Voor een voorbeeld, zie Hoe te: Een binding maken in code.

In het vorige voorbeeld wordt een eenvoudig type gegevensobject van Person gebruikt. Hier volgt de code voor dat object:

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

Syntax 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].

  • Binnen indexeerders. U kunt meerdere indexeerparameters hebben, gescheiden 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=.}".

Ontsnappingstechniek

  • In indexeerfuncties ([ ]) ontsnapt het caretteken (^) aan het volgende teken.

  • 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 speciale tekens die specifiek zijn voor de WPF-markeringsextensieparser escapen met behulp van een backslash \.

    • Backslash (\) is het escape-teken zelf.

    • Het gelijkteken (=) scheidt de eigenschapsnaam van de eigenschapswaarde.

    • Met komma (,) worden eigenschappen gescheiden.

    • De rechter accolade (}) markeert het einde van een opmaakextensie.

Bindingsrichting

Gebruik de Binding.Mode eigenschap om de richting van de binding op te geven. De volgende modi zijn de beschikbare opties voor bindingsupdates:

Koppelingsmodus Beschrijving
BindingMode.TwoWay Hiermee werkt u de doeleigenschap of de eigenschap bij wanneer de doeleigenschap of de broneigenschap wordt gewijzigd.
BindingMode.OneWay Werkt de doeleigenschap alleen bij wanneer de broneigenschap wordt gewijzigd.
BindingMode.OneTime Werkt de doeleigenschap alleen bij wanneer de toepassing wordt gestart of wanneer de DataContext wijziging wordt ondergaan.
BindingMode.OneWayToSource Hiermee wordt de broneigenschap bijgewerkt wanneer de doeleigenschap wordt gewijzigd.
BindingMode.Default Hiermee wordt de standaardwaarde Mode van de doeleigenschap gebruikt.

Zie de opsomming BindingMode voor meer informatie.

In het volgende voorbeeld ziet u hoe u de Mode eigenschap instelt:

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

Als u bronwijzigingen wilt detecteren (van toepassing op OneWay en TwoWay bindingen), moet de bron een geschikt mechanisme voor het wijzigen van eigenschappen implementeren, zoals INotifyPropertyChanged. Zie Wijzigingsmeldingen opgeven voor meer informatie.

Voor TwoWay of OneWayToSource bindingen kunt u de timing van de bronupdates beheren door de eigenschap UpdateSourceTrigger in te stellen. Zie UpdateSourceTrigger voor meer informatie.

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 dit niet instelt ConverterCulture, gebruikt de bindingsengine de Language eigenschap van het doelobject voor de binding. In XAML is de standaardwaarde en-US, of wordt de waarde van het hoofdelement (of enig ander element) van de pagina overgenomen als deze expliciet is ingesteld.

  • Zolang de binding al een gegevenscontext heeft (bijvoorbeeld de overgenomen gegevenscontext die afkomstig is van een bovenliggend element) en elk item of de verzameling die door die context wordt geretourneerd, geschikt is voor binding zonder verdere padwijziging, kan een bindingsdeclaratie helemaal geen componenten hebben: {Binding} Dit is vaak de manier waarop een binding wordt gespecificeerd voor het stylen van gegevens, waarbij de binding wordt toegepast op een verzameling. Zie Hele objecten gebruiken als bindingsbron voor 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. In het algemeen worden besturingselementeigenschappen die door de gebruiker kunnen worden bewerkt, zoals TextBox.Text en RangeBase.Value, standaard ingesteld op bindingen in twee richtingen, maar de meeste andere eigenschappen zijn standaard ingesteld op bindingen in één richting.

  • 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