Översikt över bindningsdeklarationer
I det här avsnittet beskrivs de olika sätt som du kan deklarera en bindning på.
Förutsättningar
Innan du läser det här avsnittet ä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.
Det här avsnittet beskriver inte databindningsbegrepp. En diskussion om databindningsbegrepp finns i Översikt över databindning.
Deklarera en bindning i XAML
I det här avsnittet beskrivs hur du deklarerar en bindning i XAML.
Användning av markeringstillägg
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 är Name=Value pairs där Name är namnet på egenskapen Binding och Value är värdet 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=PersonName}"/>
Du kan ange de flesta egenskaperna för Binding-klassen på det här sättet. Mer information om bindningstillägget samt en lista över Binding egenskaper som inte kan anges med bindningstillägget finns i översikten Binding Markup Extension.
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 i de fall då 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.
Följande är ett exempel på både objektelementsyntaxen och användningen av markeringstillägget:
<TextBlock Name="myconvertedtext"
Foreground="{Binding Path=TheDate,
Converter={StaticResource MyConverterReference}}">
<TextBlock.Text>
<Binding Path="TheDate"
Converter="{StaticResource MyConverterReference}"/>
</TextBlock.Text>
</TextBlock>
Exemplet binder egenskapen Foreground genom att deklarera en bindning med hjälp av tilläggssyntaxen. Bindningsdeklarationen för egenskapen Text använder objektelementsyntaxen.
Mer information om de olika termerna finns i XAML-syntax i detalj.
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. I följande exempel visas hur du skapar ett Binding objekt och anger egenskaperna i koden. I det här exemplet är TheConverter
ett objekt som implementerar IValueConverter-gränssnittet.
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
Om objektet du binder är en FrameworkElement eller en FrameworkContentElement kan du anropa SetBinding
-metoden på objektet direkt i stället för att använda BindingOperations.SetBinding. Ett exempel finns i Skapa en bindning i kod.
Syntax för bindningsvä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 kan du ha flera indexerarparametrar 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ärsys
mappas tillSystem
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 enOffices
egenskap som också är en samling. Dess aktuella objekt är ett objekt som innehåller enManagerName
egenskap.Du kan också använda en punktsökväg (.) för att binda till den aktuella källan. Till exempel motsvarar
Text="{Binding}"
Text="{Binding Path=.}"
.
Escape-mekanism
Inuti indexerare ([ ]) eskaper karet-tecknet (^) 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 undvika tecknet "&".Använd
>
för att undkomma sluttaggen ">".
Om du beskriver hela bindningen i ett attribut med hjälp av syntaxen för markup extension måste du undvika (genom att använda omvänt snedstreck \) tecken som är speciella för WPF-parsaren för markup extension:
Omvänt snedstreck (\) är själva escape-tecknet.
Likhetstecknet (=) separerar egenskapsnamnet från egenskapsvärdet.
Kommatecken (,) separerar egenskaper.
Den högra klammerparentesen (}) markerar slutet på en markup-utökning.
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 egenskapen
Language
för bindningsmålobjektet. I XAML är standardvärdet "en-US" eller ärver värdet från rotelementet (eller något 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å här en bindning anges för dataformatering. om bindningen agerar på en samling. Mer information finns i avsnittet "Hela objekt som används som bindningskälla" i Översikt över bindningskällor.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, standard för tvåvägsbindningar, medan 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
- Instruktionsämnen
- Databindning
- PropertyPath XAML-syntax
.NET Desktop feedback