我有一个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 :(得分:1)
执行此操作的可能方法之一 - 使用转换器。但您需要拥有一些字段或属性,这会将xml
数据与someotherclass
数据相关联。我创建了一个示例应用程序,它通过索引连接两个集合。希望能帮到你。
这里是代码:
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>