LINQ XML查询:如何执行绑定查询?

时间:2011-10-12 17:24:49

标签: c# xml linq xaml

这是简化的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> 

如何在我的C#代码中执行LINQ查询,以便我可以执行:

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

 listBox1.DataContext = products;

并使用我的XML文件中的条目填充列表框?感谢。

2 个答案:

答案 0 :(得分: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绑定知之甚少,以了解它是否适​​合您。 (我想它确实如此,但是......)

答案 1 :(得分: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>

当然,您可以通过编程方式设置Source的{​​{1}}属性:

XmlDataProvider

再次,只是一个FYI!