2011-10-12 81 views
1

下面是简单的XML:LINQ XML查询:如何执行绑定查询?

<Product> <Name>Red Chair</Name> <Price>29.5</Price> </Product> 

这里是简化的XAML其中一个列表框将显示名称和每个条目的价格:

<ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" >    
    <ListBox.ItemTemplate>  
     <DataTemplate>   
     <StackPanel>   
      <TextBlock Text={Binding XPath=./Name} />   
      <TextBlock Text={Binding XPath=./Price} />   
     </StackPanel>  
     </DataTemplate>  
    </ListBox.ItemTemplate> 
</ListBox> 

我该怎么做LINQ查询在我的C#代码,以便我可以这样做:

var products = from ... /* I need code between here and next statement */ 

listBox1.DataContext = products; 

并且列表框中填充了来自我的XML文件的条目?谢谢。

+0

如果你要绑定到XML,然后使用XmlDataProvider并设置其Document属性为所需的XML。否则,只需放弃XML绑定并将其绑定到类型集合即可。是否需要将您绑定的数据源保存为XML? –

+0

是的,阿纳斯,我需要保持XML中的数据。 – user776676

回答

4

你可以尝试:

var products = doc.Descendants("Product") 
        .Select(x => new { Name = (string) x.Element("Name"), 
            Price = (decimal) x.Element("Price") }); 

这不是真的清楚这是否是你想要的,但也可能是......那么你会想改变,如绑定到的东西:

<TextBlock Text={Binding Name} />   
<TextBlock Text={Binding Price} />   

您可能还需要调用ToList一次物化查询 - 我不知道有足够的了解XAML绑定知道它是否适当缓存为您服务。 (我想像它,但是......)

+0

他必须改变他的绑定语法在这种情况下,现在应该XAML在表达式中使用路径属性而不是Xpath的。 –

+0

@Anas:是的,是的。将编辑。 –

0

而且万一你仍然有你的心脏上的XML设置绑定你可以使用:-)的XmlDataProvider

<Window.Resources> 
     <XmlDataProvider Source="data.xml" XPath="Products/Product" x:Key="xmlData"> 
     </XmlDataProvider> 
    </Window.Resources> 
    <Grid> 
     <ListBox Name="listBox1" ItemsSource="{Binding Source={StaticResource xmlData}}" Margin="10" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding XPath=Name}" /> 
         <TextBlock Text="{Binding XPath=Price}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

    </Grid> 

前面的段假定你有一个data.xml文件看起来像:

<Products> 
    <Product> 
    <Name>Product 1</Name> 
    <Price>100</Price> 
    </Product> 
    <Product> 
    <Name>Product 2</Name> 
    <Price>200</Price> 
    </Product> 
</Products> 

还或者,当然你设置XmlDataProviderSource财产编程:

public MainWindow() 
{ 
    InitializeComponent(); 

    (Resources["xmlData"] as XmlDataProvider).Document = YourXDocumentHere; 
} 

再次,只是一个供参考!