2012-04-25 29 views
0

我有一個XML文件,它看起來像:WPF的DataGrid綁定到一個XML文件顯示了意外的行爲

tech.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Tech> 
<item ID="1" CATEGORY="example_1" NAME="example1" MIN_LEVEL1 ="1" MAX_LEVEL1 ="10"/> 

. 

. 

<item ID="102" CATEGORY="example_1222" NAME="example1333" MIN_LEVEL1 ="1" MAX_LEVEL1 ="10"/> 

</Tech> 

我使用的是xmldataprovider

結合這一個DataGrid的DataGridTextColumn
<XmlDataProvider x:Key="tech" Source="tech.xml" XPath="Tech" /> 

這樣

<DataGrid ItemsSource="{Binding someotherclass}"> 

<DataGridTextColumn Binding Source="{StaticResource tech}" XPath="@NAME" /> 

. 
. 
. 
other datagrid columns... 

</DataGrid> 

我遇到的問題是,DataGridTextColumn輸出中的所有行都顯示值「example1」

而不是像所期望的值example1 .... example1333。

請注意,datagrid ItemsSource綁定到某個其他數據文件,只有DataGridTextColumn綁定到tech.xml。

+0

你知道'DataGrid'將遍歷基於其'ItemsSource'財產的所有行? – stukselbax 2012-04-25 05:28:18

回答

1

做到這一點的可能方法之一 - 使用轉換器。但你需要有一些領域或財產,這將連接你的xml數據與someotherclass數據。我已經創建了示例應用程序,它通過索引連接兩個集合。希望它的幫助。

Sample app

這裏的代碼:

MainWindow.xaml:

<Window x:Class="XmlAndSeparateSource.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:XmlAndSeparateSource" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources>   
    <XmlDataProvider x:Key="TechSource" Source="tech.xml" XPath="Tech/item" /> 
    <local:RowNumberConverter x:Key="rowNumberConverter" /> 
</Window.Resources> 
<Grid> 
    <DataGrid ItemsSource="{Binding }" 
       AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="xml"> 
       <DataGridTextColumn.Binding> 
        <MultiBinding Converter="{StaticResource rowNumberConverter}"> 
         <Binding Source="{StaticResource TechSource}" /> 
         <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}" /> 
         <Binding /> 
        </MultiBinding> 
       </DataGridTextColumn.Binding> 
      </DataGridTextColumn> 
      <DataGridTextColumn Header="string" Binding="{Binding}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</Window> 

MainWindow.cs

namespace XmlAndSeparateSource 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     DataContext = new List<string>() 
     { 
      "str1", 
      "str2", 
      "str3", 
      "str4", 
     }; 
     InitializeComponent(); 

    } 
} 
} 

RowNumberConverter.cs:

class RowNumberConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 

     //get the grid and the item 
     IEnumerable<XmlNode> xml = values[0] as IEnumerable<XmlNode>; 
     DataGrid grid = values[1] as DataGrid; 
     Object item = values[2]; 
     int index = grid.Items.IndexOf(item); 

     return xml.ElementAt(index).Attributes.GetNamedItem("NAME").Value; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

tech.xml:

<Tech> 
    <item ID="1" CATEGORY="example_1" NAME="example1" MIN_LEVEL1 ="1" MAX_LEVEL1 ="10"/> 
    <item ID="2" CATEGORY="example_2" NAME="example2" MIN_LEVEL1 ="1" MAX_LEVEL1 ="10"/> 
    <item ID="3" CATEGORY="example_3" NAME="example3" MIN_LEVEL1 ="1" MAX_LEVEL1 ="10"/> 
    <item ID="102" CATEGORY="example_1222" NAME="example1333" MIN_LEVEL1 ="1" MAX_LEVEL1 ="10"/> 
</Tech> 
+0

謝謝。此方法有效。我認爲數據網格應該包含更直觀的方法來完成這一點。 – 2012-04-27 03:40:26