Como vincular a XDocument, XElement ou LINQ para resultados de consulta XML
Este exemplo demonstra como vincular dados XML a um ItemsControl usando XDocument.
Exemplo
O código XAML a seguir define um ItemsControl e inclui um modelo de dados para dados do tipo Planet
no namespace XML http://planetsNS
. Um tipo de dados XML que ocupa um namespace deve incluir o namespace em chaves e, se aparecer onde uma extensão de marcação XAML pode aparecer, ele deve preceder o namespace com uma sequência de escape de chave. Esse código se liga a propriedades dinâmicas que correspondem aos métodos Element e Attribute da classe XElement. As propriedades dinâmicas permitem que o XAML se associe a propriedades dinâmicas que compartilham os nomes dos métodos. Para saber mais, consulte propriedades dinâmicas de LINQ para XML. Observe como a declaração de namespace padrão para o XML não se aplica a nomes de atributos.
<StackPanel Name="stacky">
<StackPanel.Resources>
<DataTemplate DataType="{}{http://planetsNS}Planet" >
<StackPanel Orientation="Horizontal">
<TextBlock Width="100" Text="{Binding Path=Element[{http://planetsNS}DiameterKM].Value}" />
<TextBlock Width="100" Text="{Binding Path=Attribute[Name].Value}" />
<TextBlock Text="{Binding Path=Element[{http://planetsNS}Details].Value}" />
</StackPanel>
</DataTemplate>
</StackPanel.Resources>
<ItemsControl
ItemsSource="{Binding }" >
</ItemsControl>
</StackPanel>
O código C# a seguir chama Load e define o contexto de dados do painel de stack para todos os subelementos do elemento chamado SolarSystemPlanets
no namespace XML http://planetsNS
.
planetsDoc = XDocument.Load("../../Planets.xml");
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = XDocument.Load("../../Planets.xml")
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
Os dados XML podem ser armazenados como um recurso XAML usando ObjectDataProvider. Para obter um exemplo completo, consulte o código fonte L2DBForm.xaml . O exemplo a seguir mostra como o código pode definir o contexto de dados para um recurso de objeto.
planetsDoc = (XDocument)((ObjectDataProvider)Resources["justTwoPlanets"]).Data;
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = CType((CType(Resources("justTwoPlanets"), ObjectDataProvider)).Data, XDocument)
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
As propriedades dinâmicas mapeadas para Element e Attribute fornecem flexibilidade em XAML. Seu código também pode se vincular aos resultados de uma consulta LINQ for XML. Este exemplo se liga aos resultados da consulta ordenados por um valor de elemento.
stacky.DataContext =
from c in planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
orderby Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
select c;
stacky.DataContext = From c In planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
Order By Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
Select c
Ver também
.NET Desktop feedback