我无法将XML数据设置为DataGrid Combobox的ItemsSource。
以下是我的XML代码:
<?xml version="1.0" standalone="yes"?>
<Table>
<FRUIT>
<edible>True</edible>
<Types main="Apple">
<Type>Fuji</Type>
<Type>Gala</Type>
</Types>
</FRUIT>
<FRUIT>
<edible>True</edible>
<Types main="Banana">
<Type>Burro</Type>
<Type>Red</Type>
</Types>
</FRUIT>
</Table>
接下来是WPFtoolkit DataGrid组合框的XAML代码:
<Custom:DataGridTemplateColumn Header="Fruits" Width="300">
<Custom:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="cboFruit"/>
</DataTemplate>
</Custom:DataGridTemplateColumn.CellTemplate>
</Custom:DataGridTemplateColumn>
在我必须将数据加载到ComboBox之前,我只是将XML数据放入DataSet并将DataGrid的DataContext设置为DataSet中的第一个表。
现在这不起作用,因为我试图将每种类型的水果放入ComboBox。
我可以更改XML中的任何内容以使其工作。如果您需要更多信息,请告诉我。
提前致谢!
以下是我的CustomDataGrid(WPFtoolkit)的完整XAML:
<Window.DataContext>
<XmlDataProvider x:Name="FruitData" XPath="fruits/fruit" />
</Window.DataContext>
<Grid>
<Custom:CustomDataGrid x:Name="dgFruits" AutoGenerateColumns="False" Margin="5" CanUserAddRows="True"
ItemsSource="{Binding XPath=fruits/fruit}"><!--Here is confusion-->
<Custom:DataGrid.Columns>
<!--Edible-->
<Custom:DataGridTextColumn Header="Edible" Binding="{Binding XPath=edible}"/>
<!--Fruit-->
<Custom:DataGridTemplateColumn Header="Fruit Types" Width="300">
<Custom:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding XPath=types/type}"/><!--This works fine on a combobox outside of the DataGrid-->
</DataTemplate>
</Custom:DataGridTemplateColumn.CellTemplate>
</Custom:DataGridTemplateColumn>
</Custom:CustomDataGrid>
</Grid>
答案 0 :(得分:1)
以下是使用XmlDataProvider
将XML布局更新为以下内容:
<?xml version="1.0" standalone="yes"?>
<fruits xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fruit>
<edible>True</edible>
<types main="Apple">
<type>
<name>Fuji</name>
</type>
<type>
<name>Gala</name>
</type>
</types>
</fruit>
<fruit>
<edible>True</edible>
<types main="Banana">
<type>
<name>Burro</name>
</type>
<type>
<name>Red</name>
</type>
</types>
</fruit>
</fruits>
在xaml中,创建数据,然后使用XPath访问XML节点
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<XmlDataProvider x:Name="FruitData" Source="fruits.xml" XPath="fruits/fruit" />
</Window.DataContext>
<Grid>
<Grid.Resources>
<DataTemplate x:Key="FruitDataTemplate">
<StackPanel>
<Label Content="{Binding XPath=edible}"/>
<ComboBox ItemsSource="{Binding XPath=types/type}"/>
</StackPanel>
</DataTemplate>
</Grid.Resources>
<ListBox ItemsSource="{Binding}"
ItemTemplate="{StaticResource FruitDataTemplate}"
IsSynchronizedWithCurrentItem="True"
Visibility="Visible" SelectionMode="Single">
</ListBox>
</Grid>
</Window>
编辑:
这里使用的是DataGrid
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<XmlDataProvider x:Name="FruitData" Source="fruits.xml" />
</Window.DataContext>
<Grid>
<DataGrid x:Name="dgFruits" AutoGenerateColumns="False" Margin="5" CanUserAddRows="True"
ItemsSource="{Binding XPath=fruits/fruit}">
<DataGrid.Columns>
<!--Edible-->
<DataGridTextColumn Header="Edible" Binding="{Binding XPath=edible}"/>
<!--Fruit-->
<DataGridTemplateColumn Header="Fruit Types" Width="300">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding XPath=types/type}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>