2014-10-21 4 views
1

У меня возникли проблемы с установкой данных XML в качестве источника Items для моего DataGrid Combobox.Загрузка WPF DataGrid ComboBox в данные XML

Ниже мой 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> 

Следующая является XAML код WPFtoolkit DataGrid Combobox:

<Custom:DataGridTemplateColumn Header="Fruits" Width="300"> 
    <Custom:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox Name="cboFruit"/> 
     </DataTemplate> 
    </Custom:DataGridTemplateColumn.CellTemplate> 
</Custom:DataGridTemplateColumn> 

Прежде чем я должен загрузить данные в ComboBox, я просто поставил XML в DataSet и установить DataContext DataGrid в первую таблицу в DataSet.

Теперь это не сработает, так как я пытаюсь поместить каждый тип фруктов в ComboBox.

Я могу изменить что-либо в XML, чтобы заставить его работать. Дайте мне знать, если вам нужна дополнительная информация.

Заранее благодарен!

Опубликовано ниже полный XAML для моего CustomDataGrid (WPFtoolkit):

<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

файл XML является недействительным. XML-документ может иметь только один корень. Также нам не нужен какой-либо DataSet для загрузки XML. Вы можете использовать такие, как 'XmlDataProvider' или даже Linq-to-XML. –

+0

А, мой плохой. У меня есть 1 корень для капсулы ФРУКТОВ (названный

), я забыл включить. Будет ли XMLDataProvider разрешать динамический источник? – Turkwise

+0

Я не уверен, но свойство 'Source' является изменчивым. Вы можете просто попробовать изменить это свойство в коде. Обратите внимание, что структура данных должна быть такой же, чтобы текущее Связывание не было нарушено после переключения источника. –

ответ

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, создать данные, а затем получить доступ к узлам XML с использованием XPath

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

Edit:

Здесь он использует 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> 
+0

Ах, большое вам спасибо за ваш ответ! Быстрый вопрос - будет ли работать с XMLDataProvider, если изменится путь к файлу исходного XML-файла? Я имею в виду, что у меня есть C: \ test1 \ fruits.xml и C: \ test2 \ fruits.xml. Пользователь сможет выбирать между двумя файлами XML. – Turkwise

+1

@Turkwise вы можете определенно изменить источник. См. Это сообщение для получения дополнительной информации: http://stackoverflow.com/questions/2037906/how-to-change-xmldataprovider-source-in-wpf-at-runtime –

+0

Спасибо, я получил информацию для заполнения в регулярной combobox , но combobox в моей CustomDataGrid остается пустым, когда я использую тот же код. Есть ли что-то, что мне не хватает в основной части DataGrid? Я попробовал , но не прошел. – Turkwise

Смежные вопросы