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.
Det här exemplet visar hur du binder till XML-data med hjälp av en XmlDataProvider.
Med en XmlDataProviderkan underliggande data som kan nås via databindning i ditt program vara valfritt träd med XML-noder. Med andra ord är en XmlDataProvider ett bekvämt sätt att använda valfritt träd med XML-noder som bindningskälla.
Exempel
I följande exempel bäddas data in direkt som en XML-dataö i avsnittet Resources. En XML-dataö måste vara omsluten i <x:XData>
taggar och alltid ha en enda rotnod, vilket är Inventory i det här exemplet.
Obs.
Rotnoden för XML-data har ett xmlns-attribut som anger XML-namnområdet till en tom sträng. Detta är ett krav för att tillämpa XPath-frågor på en dataö som är infogad på XAML-sidan. I fallet där koden är inline ärver XAML och därmed dataön namnområdet System.Windows. Därför måste du ange namnområdet tomt för att förhindra att XPath-frågor kvalificeras av System.Windows namnområdet, vilket skulle vilseleda frågorna.
<StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Cornsilk">
<StackPanel.Resources>
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
<x:XData>
<Inventory xmlns="">
<Books>
<Book ISBN="0-7356-0562-9" Stock="in" Number="9">
<Title>XML in Action</Title>
<Summary>XML Web Technology</Summary>
</Book>
<Book ISBN="0-7356-1370-2" Stock="in" Number="8">
<Title>Programming Microsoft Windows With C#</Title>
<Summary>C# Programming using the .NET Framework</Summary>
</Book>
<Book ISBN="0-7356-1288-9" Stock="out" Number="7">
<Title>Inside C#</Title>
<Summary>C# Language Programming</Summary>
</Book>
<Book ISBN="0-7356-1377-X" Stock="in" Number="5">
<Title>Introducing Microsoft .NET</Title>
<Summary>Overview of .NET Technology</Summary>
</Book>
<Book ISBN="0-7356-1448-2" Stock="out" Number="4">
<Title>Microsoft C# Language Specifications</Title>
<Summary>The C# language definition</Summary>
</Book>
</Books>
<CDs>
<CD Stock="in" Number="3">
<Title>Classical Collection</Title>
<Summary>Classical Music</Summary>
</CD>
<CD Stock="out" Number="9">
<Title>Jazz Collection</Title>
<Summary>Jazz Music</Summary>
</CD>
</CDs>
</Inventory>
</x:XData>
</XmlDataProvider>
</StackPanel.Resources>
<TextBlock FontSize="18" FontWeight="Bold" Margin="10"
HorizontalAlignment="Center">XML Data Source Sample</TextBlock>
<ListBox
Width="400" Height="300" Background="Honeydew">
<ListBox.ItemsSource>
<Binding Source="{StaticResource InventoryData}"
XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
</ListBox.ItemsSource>
<!--Alternatively, you can do the following. -->
<!--<ListBox Width="400" Height="300" Background="Honeydew"
ItemsSource="{Binding Source={StaticResource InventoryData},
XPath=*[@Stock\=\'out\'] | *[@Number>\=8 or @Number\=3]}">-->
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding XPath="Title"/>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
Som du ser i det här exemplet måste du, om du vill skapa samma bindningsdeklaration i attributsyntaxen, undvika specialtecken korrekt. Mer information finns i XML-teckenentiteter och XAML-.
I ListBox visas följande objekt när det här exemplet körs. Det här är Titels för alla elementen under Books med antingen ett Lager-värde på "ut" eller ett Tal-värde på 3 eller större eller lika med 8. Observera att inga CD- objekt returneras eftersom det XPath värde som angetts på XmlDataProvider anger att endast Books- element ska exponeras (i princip ett filter).
I det här exemplet visas boktitlarna eftersom XPath för TextBlock-bindningen i DataTemplate är inställd på "Rubrik". Om du vill visa värdet för ett attribut, till exempel ISBN, anger du det XPath värdet till "@ISBN
".
Egenskaperna XPath i WPF hanteras av metoden XmlNode.SelectNodes. Du kan ändra XPath- frågor för att få olika resultat. Här följer några exempel på frågan XPath på det bundna ListBox från föregående exempel.
XPath="Book[1]"
returnerar det första bokelementet ("XML i åtgärd"). Observera att XPath- index baseras på 1, inte 0.XPath="Book[@*]"
returnerar alla bokelement med vilka attribut som helst.XPath="Book[last()-1]"
returnerar det näst sista bokelementet ("Introducing Microsoft .NET").XPath="*[position()>3]"
returnerar alla bokelement förutom de första 3.
När du kör en XPath- fråga returneras en XmlNode eller en lista med XmlNodes. XmlNode är ett CLR-objekt (Common Language Runtime), vilket innebär att du kan använda egenskapen Path för att binda till clr-egenskaperna (common language runtime). Överväg föregående exempel igen. Om resten av exemplet förblir detsamma och du ändrar TextBlock bindning till följande visas namnen på de returnerade XmlNodes i ListBox. I det här fallet är namnet på alla returnerade noder "Book".
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
I vissa program kan det vara obekvämt att bädda in XML som en dataö i XAML-sidans källa eftersom det exakta innehållet i data måste vara känt vid kompileringen. Därför stöds även hämtning av data från en extern XML-fil, som i följande exempel:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
Om XML-data finns i en fjärransluten XML-fil definierar du åtkomsten till data genom att tilldela en lämplig URL till attributet Source enligt följande:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
Se även
.NET Desktop feedback