WPF DataGrid ComboBox加载XML数据

时间:2014-10-21 19:09:57

标签: xml wpf xaml datagrid

我无法将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>

1 个答案:

答案 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>