【问题标题】:LINQ XML query: How do I perform query for binding?LINQ XML 查询:如何执行绑定查询?
【发布时间】:2011-10-12 17:24:49
【问题描述】:

这是简化的 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 文件中的条目?谢谢。

【问题讨论】:

  • 如果要绑定到 XML,则使用 XmlDataProvider 并将其 Document 属性设置为所需的 XML。否则,只需放弃 XML 绑定并改为绑定到类型化集合。是否需要将您绑定到的数据源保留为 XML?
  • 是的,Anas,我需要将数据保存在 XML 中。

标签: c# xml linq xaml


【解决方案1】:

你可以试试:

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 绑定的了解不够多,无法知道它是否适合您缓存。 (我想是的,但是...)

【讨论】:

  • 在这种情况下他将不得不改变他的绑定语法,现在 XAML 应该在绑定表达式中使用 Path 属性而不是 Xpath。
【解决方案2】:

如果您仍然对 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>

前面的 sn-p 假设你有一个 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;
}

再次,仅供参考!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多