2014-10-21 3 views
1

DataGrid ComboBox의 ItemsSource로 XML 데이터를 설정하는 데 문제가 있습니다. 나는 콤보 상자에 데이터를로드 할 수 있었다 전에WPF DataGrid ComboBox XML 데이터로드

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

것은, 난 그냥 넣어 :

<?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 코드 : 아래

내 XML 코드 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

XML 파일이 유효하지 않은 데이터 그리드를 사용하고 있습니다. XML 문서는 오직 하나의 루트만을 가질 수 있습니다. 또한 XML을로드하기 위해 DataSet이 필요하지 않습니다. 'XmlDataProvider' 또는 Linq-to-XML 등을 사용할 수 있습니다. –

+0

아, 제 잘못입니다. 나는 캡슐에 FRUIT (이름이

) 인 루트를 가지고 있는데, 포함하지 않았다. XMLDataProvider가 동적 소스를 허용합니까? – Turkwise

+0

'Source' 속성을 변경할 수 있습니다. 코드에서 해당 속성을 변경해보십시오. 소스의 전환 후에 현재 바인딩이 깨지지 않도록 데이터의 구조가 동일해야합니다. –

답변

1

여기 다음에 XmlDataProvider

업데이트 XML 레이아웃을 사용하는 예이다 : XAML에서

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

, 데이터를 만든 다음 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> 

편집 : 여기

그것이

<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

아, 답장을 보내 주셔서 감사합니다. 빠른 질문 - 소스 XML 파일 경로가 변경되면 XMLDataProvider가 작동합니까? 내 말은 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

감사합니다. 정기적 인 콤보 상자에 정보를 입력했습니다. ,하지만 동일한 코드를 사용하면 내 CustomDataGrid의 콤보 상자가 비어 있습니다. DataGrid의 주요 부분에서 빠진 것이 있습니까? 나는 시도했다 Turkwise

관련 문제