Dela via


Vad är bindande deklarationer?

Vanligtvis deklarerar utvecklare bindningarna direkt i XAML-markering för de användargränssnittselement som de vill binda data till. Du kan dock även deklarera bindningar i kod. Den här artikeln beskriver hur du deklarerar bindningar i både XAML och i kod.

Förutsättningar

Innan du läser den här artikeln är det viktigt att du är bekant med begreppet och användningen av tillägg för markering. Mer information om tillägg för markering finns i Markup Extensions och WPF XAML.

Den här artikeln beskriver inte databindningsbegrepp. En diskussion om databindningsbegrepp finns i Översikt över databindning.

Deklarera en bindning i XAML

Binding är ett markup-tillägg. När du använder bindningstillägget för att deklarera en bindning består deklarationen av en serie satser som följer nyckelordet Binding och avgränsas med kommatecken (,). Satserna i bindningsdeklarationen kan vara i valfri ordning och det finns många möjliga kombinationer. Satserna ärnamn=värde-par, där Namn är namnet på Binding egenskapen och Värde är det värde som du anger för egenskapen.

När du skapar bindningsdeklarationssträngar i markering måste de kopplas till den specifika beroendeegenskapen för ett målobjekt. I följande exempel visas hur du binder egenskapen TextBox.Text med hjälp av bindningstillägget och anger egenskaperna Source och Path.

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

I föregående exempel används en enkel dataobjekttyp av Person. Följande kodfragment är koden för objektet:

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

Du kan ange de flesta egenskaperna för Binding-klassen på det här sättet. Mer information om bindningstillägget och en lista över Binding egenskaper som inte kan anges med bindningstillägget finns i översikten över Bindningsmarkeringstillägg (.NET Framework).

Ett exempel på hur du skapar en bindning i XAML finns i Så här skapar du en databindning.

Syntax för objektelement

Objektelementsyntax är ett alternativ till att skapa bindningsdeklarationen. I de flesta fall finns det ingen särskild fördel med att använda antingen markeringstillägget eller objektelementsyntaxen. Men när markeringstillägget inte stöder ditt scenario, till exempel när egenskapsvärdet är av en icke-strängtyp som ingen typkonvertering finns för, måste du använda objektelementsyntaxen.

I föregående avsnitt visades hur du binder med ett XAML-tillägg. I följande exempel visas hur du gör samma bindning men använder objektelementsyntax:

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

Mer information om de olika termerna finns i XAML-syntax i detalj (.NET Framework).

MultiBinding och PriorityBinding

MultiBinding och PriorityBinding stöder inte XAML-tilläggssyntaxen. Därför måste du använda objektelementsyntaxen om du deklarerar en MultiBinding eller en PriorityBinding i XAML.

Skapa en bindning i kod

Ett annat sätt att ange en bindning är att ange egenskaper direkt på ett Binding objekt i kod och sedan tilldela bindningen till en egenskap. I följande exempel visas hur du skapar ett Binding objekt i kod.

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

Föregående kod anger följande för bindningen:

  • En sökväg till egenskapen för objektet i datakällan.
  • Bindningens läge.
  • Datakällan, i det här fallet en enkel objektinstans som representerar en person.
  • En valfri konverterare som bearbetar värdet som kommer in från datakällans objekt innan det tilldelas till målegenskapen.

När objektet du binder är ett FrameworkElement eller ett FrameworkContentElementkan du anropa SetBinding metoden på objektet direkt i stället för att använda BindingOperations.SetBinding. Ett exempel finns i How to: Create a Binding in Code (Så här skapar du en bindning i kod).

I föregående exempel används en enkel dataobjekttyp av Person. Följande är koden för objektet:

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 för bindningssökväg

Använd egenskapen Path för att ange det källvärde som du vill binda till:

  • I det enklaste fallet är Path egenskapsvärdet namnet på egenskapen för källobjektet som ska användas för bindningen, till exempel Path=PropertyName.

  • Underegenskaper för en egenskap kan anges med en liknande syntax som i C#. Satsen Path=ShoppingCart.Order till exempel anger bindningen till underegenskaperna Order för objektet eller egenskapen ShoppingCart.

  • Om du vill binda till en bifogad egenskap placerar du parenteser runt den anslutna egenskapen. Om du till exempel vill binda till den kopplade egenskapen DockPanel.Dockär syntaxen Path=(DockPanel.Dock).

  • Indexerare för en egenskap kan anges inom hakparenteser efter egenskapsnamnet där indexeraren tillämpas. Satsen Path=ShoppingCart[0] till exempel anger bindningen till det index som motsvarar hur egenskapens interna indexering hanterar literalsträngen "0". Kapslade indexerare stöds också.

  • Indexerare och underegenskaper kan blandas i en Path-sats. till exempel Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Inuti indexerare. Du kan ha flera indexerareparametrar avgränsade med kommatecken (,). Typen av varje parameter kan anges med parenteser. Du kan till exempel ha Path="[(sys:Int32)42,(sys:Int32)24]", där sys mappas till System namnområdet.

  • När källan är en samlingsvy kan det aktuella objektet anges med ett snedstreck (/). Satsen Path=/ till exempel anger bindningen till det aktuella objektet i vyn. När källan är en samling anger den här syntaxen det aktuella objektet i standardsamlingsvyn.

  • Egenskapsnamn och snedstreck kan kombineras för att bläddra igenom egenskaper som är samlingar. Till exempel anger Path=/Offices/ManagerName det aktuella objektet i källsamlingen, som innehåller en Offices egenskap som också är en samling. Dess aktuella objekt är ett objekt som innehåller en ManagerName egenskap.

  • Du kan också använda en periodsökväg (.) för att binda till den aktuella källan. Text="{Binding}" motsvarar till exempel Text="{Binding Path=.}".

Mekanism för att fly

  • Inuti indexerare ([ ])^ undflys nästa tecken.

  • Om du anger Path i XAML måste du också ta bort vissa tecken (med XML-entiteter) som är speciella för XML-språkdefinitionen:

    • Använd &amp; för att undkomma tecknet "&".

    • Använd &gt; för att undkomma sluttaggen ">".

  • Om du beskriver hela bindningen i ett attribut med hjälp av syntaxen för markeringstillägget måste du dessutom komma undan (med omvänt snedstreck \) tecken som är speciella för parsern för WPF-markeringstillägget:

    • Omvänt snedstreck (\) är själva escape-tecknet.

    • Likhetstecknet (=) separerar egenskapsnamnet från egenskapsvärdet.

    • Kommatecken (,) separerar egenskaper.

    • Rätt klammerparentes (}) är slutet på ett tillägg för markering.

Bindningsriktning

Använd egenskapen Binding.Mode för att ange bindningens riktning. Följande lägen är tillgängliga alternativ för bindningsuppdateringar:

Bindningsläge Beskrivning
BindingMode.TwoWay Uppdaterar målegenskapen eller egenskapen när antingen målegenskapen eller källegenskapen ändras.
BindingMode.OneWay Uppdaterar endast målegenskapen när källegenskapen ändras.
BindingMode.OneTime Uppdaterar målegenskapen endast när programmet startar eller när DataContext genomgår en ändring.
BindingMode.OneWayToSource Uppdaterar källegenskapen när målegenskapen ändras.
BindingMode.Default Gör att standardvärdet Mode för målegenskapen används.

Mer information finns i BindingMode uppräkningen.

I följande exempel visas hur du Mode anger egenskapen:

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

För att identifiera källändringar (gäller för OneWay- och TwoWay-bindningar) måste källan implementera en lämplig meddelandemekanism för egenskapsändring, till exempel INotifyPropertyChanged. Mer information finns i Tillhandahålla ändringsmeddelanden.

För TwoWay eller OneWayToSource bindningar kan du styra tidpunkten för källuppdateringarna genom att ange egenskapen UpdateSourceTrigger. Mer information finns i UpdateSourceTrigger.

Standardbeteenden

Standardbeteendet är följande om det inte anges i deklarationen:

  • En standardkonverterare skapas som försöker utföra en typkonvertering mellan bindningskällans värde och det bindande målvärdet. Om det inte går att göra en konvertering returnerar standardkonverteraren null.

  • Om du inte anger ConverterCultureanvänder bindningsmotorn Language egenskapen för bindningsmålobjektet. I XAML har detta som standardinställning en-US eller ärver värdet från rotelementet (eller något annat element) på sidan, om ett har angetts uttryckligen.

  • Så länge bindningen redan har en datakontext (till exempel den ärvda datakontexten som kommer från ett överordnat element) och det objekt eller den samling som returneras av den kontexten är lämplig för bindning utan ytterligare sökvägsändring, kan en bindningsdeklaration inte ha några satser alls: {Binding}. Det är ofta så en bindning anges för dataformatering, där bindningen fungerar på en samling. Mer information finns i Använda hela objekt som bindningskälla.

  • Standardvärdet Mode varierar mellan enkelriktad och dubbelriktad beroende på vilken beroendeegenskap som är bunden. Du kan alltid deklarera bindningsläget explicit för att säkerställa att bindningen har önskat beteende. I allmänhet är användarredigerbara kontrollegenskaper, till exempel TextBox.Text och RangeBase.Value, som standard tvåvägsbindningar, men de flesta andra egenskaper är standard för enkelriktade bindningar.

  • Standardvärdet för UpdateSourceTrigger varierar mellan PropertyChanged och LostFocus beroende på den bundna beroendeegenskapen. Standardvärdet för de flesta beroendeegenskaper är PropertyChanged, medan egenskapen TextBox.Text har standardvärdet LostFocus.

Se även