Dela via


Översikt över WPF-databindning med LINQ till XML

Den här artikeln beskriver funktionerna för dynamisk databindning i System.Xml.Linq namnområdet. Dessa funktioner kan användas som datakälla för användargränssnittselement (UI) i WPF-appar (Windows Presentation Foundation). Det här scenariot förlitar sig på särskilda dynamiska egenskaper för System.Xml.Linq.XAttribute och System.Xml.Linq.XElement.

XAML och LINQ till XML

XAML (Extensible Application Markup Language) är en XML-dialekt som skapats av Microsoft för att stödja .NET-tekniker. Den används i WPF för att representera användargränssnittselement och relaterade funktioner, till exempel händelser och databindning. I Windows Workflow Foundation används XAML för att representera programstruktur, till exempel programkontroll (arbetsflöden). Med XAML kan deklarativa aspekterna av en teknik separeras från den relaterade procedurkoden som definierar det mer individualiserade beteendet för ett program.

Det finns två breda sätt som XAML och LINQ till XML kan interagera på:

  • Eftersom XAML-filer är välformulerade XML kan de efterfrågas och manipuleras via XML-tekniker som LINQ till XML.

  • Eftersom LINQ till XML-frågor representerar en datakälla kan dessa frågor användas som datakälla för databindning för WPF-gränssnittselement.

Den här dokumentationen beskriver det andra scenariot.

Databindning i Windows Presentation Foundation

WPF-databindning gör det möjligt för ett gränssnittselement att associera en av dess egenskaper med en datakälla. Ett enkelt exempel på detta är en Label vars text visar värdet för en offentlig egenskap i ett användardefinierat objekt. WPF-databindning förlitar sig på följande komponenter:

Komponent Beskrivning
Bindningsmål Användargränssnittselementet som ska associeras med datakällan. Visuella element i WPF härleds från UIElement-klassen.
Målfastighet Beroendeegenskapen för bindningsmålet som återspeglar värdet för databindningskällan. Beroendeegenskaper stöds direkt av DependencyObject klassen, som UIElement härleds från.
Bindningskälla Källobjektet för ett eller flera värden som skickas till användargränssnittselementet för presentation. WPF stöder automatiskt följande typer som bindningskällor: CLR-objekt, ADO.NET dataobjekt, XML-data (från XPath eller LINQ till XML-frågor) eller en annan DependencyObject.
Källsökväg Egenskapen för den bindningskälla som matchar värdet eller uppsättningen med värden som ska bindas.

En beroendeegenskap är ett begrepp som är specifikt för WPF som representerar en dynamiskt beräknad egenskap för ett gränssnittselement. Beroendeegenskaper har till exempel ofta standardvärden eller värden som tillhandahålls av ett överordnat element. Dessa särskilda egenskaper backas upp av instanser av DependencyProperty klassen (och inte fält som med standardegenskaper). Mer information hittar du i översikt över beroendeegenskaper.

Dynamisk databindning i WPF

Som standard sker databindning endast när målgränssnittselementet initieras. Detta kallas engångsbindning . För de flesta ändamål är detta otillräckligt. Normalt kräver en databindningslösning att ändringarna sprids dynamiskt vid körning med något av följande:

  • Enkelriktad bindning gör att ändringarna på ena sidan sprids automatiskt. Oftast återspeglas ändringar i källan i målet, men det omvända kan ibland vara användbart.

  • I tvåvägsbindning sprids ändringar till källan automatiskt till målet och ändringar i målet sprids automatiskt till källan.

För att envägs- eller tvåvägsbindning ska ske måste källan implementera en mekanism för ändringsmeddelanden, till exempel genom att implementera INotifyPropertyChanged gränssnittet eller med hjälp av ett PropertyNameChanged-mönster för varje egenskap som stöds.

Mer information om databindning i WPF finns i Databindning (WPF).

Dynamiska egenskaper i LINQ till XML-klasser

De flesta LINQ-till XML-klasser kvalificerar sig inte som rätt WPF-dynamiska datakällor. En del av den mest användbara informationen är endast tillgänglig via metoder, inte egenskaper, och egenskaper i dessa klasser implementerar inte ändringsmeddelanden. För att stödja WPF-databindning exponerar LINQ till XML en uppsättning dynamiska egenskaper.

Dessa dynamiska egenskaper är särskilda körningsegenskaper som duplicerar funktionerna i befintliga metoder och egenskaper i klasserna XAttribute och XElement . De har lagts till i dessa klasser enbart för att göra det möjligt för dem att fungera som dynamiska datakällor för WPF. För att uppfylla detta behov implementerar alla dessa dynamiska egenskaper ändringsmeddelanden. En detaljerad referens för dessa dynamiska egenskaper finns i nästa avsnitt, LINQ till DYNAMISKA XML-egenskaper.

Anmärkning

Många av de offentliga standardegenskaperna som finns i de olika klasserna i System.Xml.Linq namnområdet kan användas för engångsdatabindning. Kom dock ihåg att varken källan eller målet kommer att uppdateras dynamiskt enligt det här schemat.

Få åtkomst till dynamiska egenskaper

Dynamiska egenskaper i klasserna XAttribute och XElement kan inte nås som standardegenskaper. I CLR-kompatibla språk som C# kan de till exempel inte vara:

  • Nås direkt vid kompileringstillfället. Dynamiska egenskaper är osynliga för kompilatorn och Visual Studio IntelliSense.

  • Identifieras eller nås under körning med hjälp av .NET reflection. Även vid körning är de inte egenskaper i grundläggande CLR-mening.

I C# kan dynamiska egenskaper endast nås vid körning via de faciliteter som tillhandahålls av System.ComponentModel namnområdet.

Däremot kan dynamiska egenskaper i en XML-källa nås genom en enkel notation enligt följande form:

<object>.<dynamic-property>

De dynamiska egenskaperna för dessa två klasser avsätts antingen till ett värde som kan användas direkt eller till en indexerare som måste förses med ett index för att erhålla det resulterande värdet eller en samling av värden. Den senare syntaxen har formatet:

<object>.<dynamic-property>[<index-value>]

Mer information finns i LINQ till XML dynamiska egenskaper.

För att implementera dynamisk WPF-bindning används dynamiska egenskaper med faciliteter som tillhandahålls av System.Windows.Data namnområdet, framför allt Binding klassen.

Se även