【问题标题】:WPF DataGrid ComboBox load in XML dataWPF DataGrid ComboBox 加载 XML 数据
【发布时间】:2014-10-21 19:09:57
【问题描述】:

我在将 XML 数据设置为我的 DataGrid 组合框的 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 Combobox 的 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>

【问题讨论】:

  • 您的 XML 文件无效。 XML 文档只能有 1 个根。此外,我们不需要任何 DataSet 来加载 XML。你可以使用诸如XmlDataProvider,甚至是Linq-to-XML。
  • 啊,我的错。我确实有 1 个根来封装 FRUIT(名为 ),但我忘了包括在内。 XMLDataProvider 是否允许动态源?
  • 我不太确定,但 Source 属性是可变的。您可以尝试在后面的代码中更改该属性。注意数据的结构要一致,保证切换Source后不会破坏当前的Binding。
  • 当然,感谢您的反馈!

标签: xml wpf xaml datagrid


【解决方案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>

【讨论】:

  • 啊,非常感谢您的回复!快速提问 - 如果源 XML 文件路径发生更改,XMLDataProvider 会起作用吗?我的意思是说我有一个 C:\test1\fruits.xml 和 C:\test2\fruits.xml。用户将能够在两个 XML 文件之间进行选择。
  • @Turkwise 您绝对可以更改来源。有关更多信息,请参阅此帖子:stackoverflow.com/questions/2037906/…
  • 谢谢,我得到了要填充到常规组合框中的信息,但是当我使用相同的代码时,我的 CustomDataGrid 中的组合框仍然是空白的。我在 DataGrid 的主要部分中缺少什么吗?我试过 但没有成功。
  • @Turkwise 发布您当前的 XAML,以便我查看
  • 查看我的编辑。它与 XmlDataProvider 的 XPath 定义有关。我的新代码按预期工作。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2013-06-30
  • 2017-10-15
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多