Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 underegenskapernaOrder
för objektet eller egenskapenShoppingCart
.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 exempelPath=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 haPath="[(sys:Int32)42,(sys:Int32)24]"
, därsys
mappas tillSystem
namnområdet.När källan är en samlingsvy kan det aktuella objektet anges med ett snedstreck (
/
). SatsenPath=/
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 enOffices
egenskap som också är en samling. Dess aktuella objekt är ett objekt som innehåller enManagerName
egenskap.Du kan också använda en periodsökväg (
.
) för att binda till den aktuella källan.Text="{Binding}"
motsvarar till exempelText="{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
&
för att undkomma tecknet "&
".Använd
>
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ällningen-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
- Översikt över databindning
- Översikt över bindningskällor
- Skapa en databindning
- PropertyPath XAML-syntax (.NET Framework)
.NET Desktop feedback