2011-10-12 34 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; 
} 

再次,只是一個供參考!