Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Beispiel wird die Bindung an XML-Daten veranschaulicht, indem einem XmlDataProvider verwendet wird.
Mit einem XmlDataProvider können die untergeordneten Daten, die durch die Datenbindung in Ihrer App abgerufen werden können, irgendeine XML-Knotenstruktur sein. Mit anderen Worten, ein XmlDataProvider bietet eine bequeme Möglichkeit, einen beliebigen Baum von XML-Knoten als Bindungsquelle zu verwenden.
Beispiel
Im folgenden Beispiel werden die Daten direkt als XML-Dateninsel in den Resources-Abschnitt eingebettet. Eine XML-Dateninsel muss in <x:XData>
Tags eingeschlossen werden und immer einen einzelnen Stammknoten aufweisen, der in diesem Beispiel Inventory ist.
Anmerkung
Der Stammknoten der XML-Daten weist ein xmlns Attribut auf, das den XML-Namespace auf eine leere Zeichenfolge festlegt. Dies ist eine Anforderung für die Anwendung von XPath-Abfragen auf eine Dateninsel, die sich inline innerhalb der XAML-Seite befindet. In diesem Inlinefall erbt die XAML und damit die Dateninsel den System.Windows-Namespace. Aus diesem Gründen müssen Sie den Namespace leer festlegen, damit XPath-Abfragen nicht vom System.Windows-Namespace qualifiziert werden, was die Abfragen falsch leitet.
<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>
Wie in diesem Beispiel veranschaulicht, müssen Sie zum Erstellen derselben Bindungsdeklaration in der Attributsyntax die Sonderzeichen ordnungsgemäß mit einem Escapezeichen versehen. Weitere Informationen hierzu finden Sie unter XML-Zeichenentitäten und XAML.
Der ListBox zeigt das folgende Element, wenn dieses Beispiel Ausführen ist. Das sind die Title-Angaben aller Elemente unter Books, deren Stock-Wert entweder out lautet oder einen Number-Wert von 3 bzw. größer gleich 8 aufweist. Beachten Sie, dass keine CD-Elemente zurückgegeben werden, da der auf XmlDataProvider eingestellte XPath-Wert anzeigt, dass nur die Books-Elemente freigegeben werden sollten (im Wesentlichen das Festlegen eines Filters).
In diesem Beispiel werden die Buchtitel angezeigt, weil die XPath-Eigenschaft der TextBlock-Bindung im DataTemplate-Element auf "Title" festgelegt ist. Wenn Sie den Wert eines Attributs anzeigen möchten, z. B. die ISBN-, legen Sie diesen XPath Wert auf "@ISBN
" fest.
Die XPath-Eigenschaften in WPF werden von der XmlNode.SelectNodes-Methode behandelt. Sie können die XPath- Abfragen ändern, um unterschiedliche Ergebnisse zu erhalten. Hier sind einige Beispiele für die XPath-Abfrage in der Abgrenzung ListBox vom vorherigen Beispiel:
XPath="Book[1]"
gibt das erste Buchelement („XML in Action“) zurück. Beachten Sie, dass XPath- Indizes auf 1 und nicht auf 0 basieren.XPath="Book[@*]"
gibt alle Buchelemente mit beliebigen Attributen zurück.XPath="Book[last()-1]"
gibt das vorletzte Buchelement („Introducing Microsoft .NET“) zurück.XPath="*[position()>3]"
gibt außer den ersten drei Buchelementen alle Buchelemente zurück.
Wenn Sie eine XPath-Abfrage ausführen, gibt sie eine XmlNode-Klasse oder eine XmlNodes-Liste zurück. XmlNode ist ein CLR-Objekt (Common Language Runtime), was bedeutet, dass Sie die Path-Eigenschaft verwenden können, um eine Bindung an die ClR-Eigenschaften (Common Language Runtime) zu ermöglichen. Betrachten Sie das vorherige Beispiel erneut. Wenn Sie den Rest des Beispiels unverändert lassen und die TextBlock-Bindung wie folgt ändern, werden die Namen der zurückgegebenen XmlNodes in ListBox angezeigt. In diesem Fall lautet der Name aller zurückgegebenen Knoten Book.
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding Path="Name"/>
</TextBlock.Text>
</TextBlock>
In einigen Anwendungen kann das Einbetten des XML-Codes als Dateninsel in die Quelle der XAML-Seite unangenehm sein, da der genaue Inhalt der Daten zur Kompilierungszeit bekannt sein muss. Daher wird auch das Abrufen der Daten aus einer externen XML-Datei unterstützt, wie im folgenden Beispiel gezeigt:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
Wenn sich die XML-Daten in einer XML-Remotedatei befinden, definieren Sie den Zugriff auf die Daten, indem Sie dem attribut Source wie folgt eine entsprechende URL zuweisen:
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
Siehe auch
.NET Desktop feedback