2010-04-15 48 views
1

我無法正確地將列表框綁定到XML數據源(文本.xml文件)。WPF和LINQ到XML數據綁定到列表框

我正在學習如何在與書籍列表中,結合到內聯XML源,這裏顯示的微軟例子使用WPF和LINQ to XML ...

http://msdn.microsoft.com/en-us/library/bb669149.aspx

我我試圖做的是改變這個應用程序,以便它正確地綁定到一個外部的xml文件。

所以,我試圖按照修改到CodeProject上的文章中所示的示例238_How_to_perform_WPF_Data_Binding_using_LINQ_to_XML _-_ Part_2.aspx

(XAML代碼包含下面)

其示出了如何修改以使用所述應用外部xml文件。

我遇到的問題是,當應用程序啓動列表框不顯示/加載已經在我的XML文件中的數據。 xml數據字符串IS在它上面的文本框中正確顯示,並且我可以使用Add函數添加一個NEW書籍,然後在列表框中正確顯示,我可以選擇並編輯它 - 它只是不加載現有數據從啓動或初始化xml文件。

有沒有人試過這個例子,或者沒有人有一個工作的例子,或者綁定到XML文件的列表框或數據網格?

我的XAML代碼是在下面,有人可能能夠指出錯誤?

<Window x:Class="LinqToXmlDataBinding.L2XDBForm" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:system="clr-namespace:System;assembly=mscorlib" 
xmlns:xlinq="clr-namespace:System.Xml.Linq;assembly=System.Xml.Linq" 
xmlns:local="clr-namespace:LinqToXmlDataBinding" 
Title="WPF Data Binding using LINQ-to-XML" Height="665" Width="500" ResizeMode="NoResize"> 

<Window.Resources> 
    <!-- Books provider and inline data --> 
    <ObjectDataProvider x:Key="LoadedBooks" ObjectType="{x:Type xlinq:XElement}" MethodName="Load"> 
     <ObjectDataProvider.MethodParameters> 
      <system:String>C:\Files\devel\linq example\LinqToXMLDataBinding\mydata.xml</system:String>     
      <xlinq:LoadOptions>PreserveWhitespace</xlinq:LoadOptions> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

    <!-- Template for use in Books List listbox. --> 
    <DataTemplate x:Key="BookTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Margin="3" Text="{Binding Path=Attribute[id].Value}"/> 
      <TextBlock Margin="3" Text="-"/> 
      <TextBlock Margin="3" Text="{Binding Path=Element[title].Value}"/> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<!-- Main visual content container --> 
<StackPanel Background="lightblue" DataContext="{Binding Source={StaticResource LoadedBooks}}"> 
    <!-- Raw XML display section --> 
    <DockPanel Margin="5"> 
     <Label Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" FontWeight="Bold">XML 
      <Label.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </Label.LayoutTransform> 
     </Label> 
     <TextBlock Name="tbRawXml" Height="200" Background="LightGray" Text="{Binding Path=Xml}" TextTrimming="CharacterEllipsis" /> 
    </DockPanel> 

    <Separator Height="4" Margin="5" /> 

    <!-- List box to display all books section --> 
    <DockPanel Margin="5"> 
     <Label Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" FontWeight="Bold">Book List 
      <Label.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </Label.LayoutTransform> 
     </Label> 
     <ListBox Name="lbBooks" Height="200" Width="415" ItemTemplate ="{StaticResource BookTemplate}"> 
      <ListBox.ItemsSource> 
       <Binding Path="xml"/> 
      </ListBox.ItemsSource> 
     </ListBox> 
     <Button Margin="5" DockPanel.Dock="Right" Height="30" Width ="130" Content="Remove Selected Book" Click="OnRemoveBook"> 
      <Button.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </Button.LayoutTransform> 
     </Button> 
    </DockPanel> 

    <Separator Height="4" Margin="5" /> 

    <!-- Edit current selection section --> 
    <DockPanel Margin="5"> 
     <TextBlock Margin="5" Height="30" Width="65" DockPanel.Dock="Right" Background="LightGray" TextWrapping="Wrap" TextAlignment="Center"> 
       Changes are live! 
      <TextBlock.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </TextBlock.LayoutTransform> 
     </TextBlock> 
     <StackPanel> 
      <Label Width="450" Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" FontWeight="Bold">Edit Selected Book</Label> 
      <StackPanel Margin="1" DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"> 
       <StackPanel Orientation="Horizontal"> 
        <Label Width="40">ID:</Label> 
        <TextBox Name="editAttributeTextBox" Width="410" Text="{Binding Path=Attribute[id].Value}"> 
         <TextBox.ToolTip> 
          <TextBlock FontWeight="Bold" TextAlignment="Center"> 
           <Label>Edit the selected book ID and see it changed.</Label> 
          </TextBlock> 
         </TextBox.ToolTip> 
        </TextBox> 
       </StackPanel> 
       <StackPanel Orientation="Horizontal"> 
        <Label Width="40">Value:</Label> 
        <TextBox Name="editValueTextBox" Width="410" Text="{Binding Path=Element[title].Value}" Height="25"> 
         <TextBox.ToolTip> 
          <TextBlock FontWeight="Bold" TextAlignment="Center"> 
           <Label>Edit the selected book Value and see it changed.</Label> 
          </TextBlock> 
         </TextBox.ToolTip> 
        </TextBox> 
       </StackPanel> 
      </StackPanel> 
     </StackPanel> 
    </DockPanel> 

    <Separator Height="4" Margin="5" /> 

    <!-- Add new book section --> 
    <DockPanel Margin="5"> 
     <Button Margin="5" Height="30" DockPanel.Dock="Right" Click ="OnAddBook">Add Book 
      <Button.LayoutTransform> 
       <RotateTransform Angle="90"/> 
      </Button.LayoutTransform> 
     </Button> 
     <StackPanel> 
      <Label Width="450" Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" FontWeight="Bold">Add New Book</Label> 
      <StackPanel Margin="1"> 
       <StackPanel Orientation="Horizontal"> 
        <Label Width="40">ID:</Label> 
        <TextBox Name="tbAddID" Width="410"> 
         <TextBox.ToolTip> 
          <TextBlock FontWeight="Bold" TextAlignment="Center"> 
           <Label>Enter a book ID and Value pair, then click Add Book.</Label> 
          </TextBlock> 
         </TextBox.ToolTip> 
        </TextBox> 
       </StackPanel> 
       <StackPanel Orientation="Horizontal"> 
        <Label Width="40">Value:</Label> 
        <TextBox Name="tbAddValue" Width="410" Height="25"> 
         <TextBox.ToolTip> 
          <TextBlock FontWeight="UltraBold" TextAlignment="Center"> 
           <Label>Enter a book ID and Value pair, then click Add Book.</Label> 
          </TextBlock> 
         </TextBox.ToolTip> 
        </TextBox> 
       </StackPanel> 
      </StackPanel> 
     </StackPanel> 
    </DockPanel> 
</StackPanel> 
</Window> 

回答

0

你可能已經想通了這一點,但是這需要有一件事是與命名空間preceed數據模板的元素引用一(應該是,如果你恰好下面的例子)在外部XML文件: Text =「{Binding Path = Element [{http://www.mybooks.com} id] .Value}」/>

我還沒有完成剩下的問題 -