2011-05-14 55 views
0

我想用WPF中使用数据绑定的对象源的数据填充ListBox。将分层对象数据绑定到列表框

源是一个ObjectDataProvider,其数据从xml文件中加载。我读入XML文件,填入适当的数据结构,然后将ObjectDataProvider的ObjectInstance设置为数据结构。

这里是数据结构:

公共类元素 { 公共小数myvalue的;

public decimal df_myValue { get { return myValue; } set { this.myValue = value; } } 

}

公共类BasicSet { 公共元素[] ELEMENTSET;

public Element[] df_elementSet { get { return elementSet; } set { this.elementSet = value; } } 

}

公共类数据集 { 公共BasicSet [] basicSet;

public BasicSet[] df_basicSet { get { return basicSet; } set { this.basicSet = value; } } 

}

这里是XAML:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ObjectDataProvider x:Key="TheData" /> 

     <DataTemplate x:Key="ElementTemplate"> 
      <StackPanel> 
       <TextBox Text="{Binding, Path=df_myValue}" /> 
      </StackPanel> 
     </DataTemplate> 

     <HierarchicalDataTemplate x:Key="ElementSetTemplate" ItemsSource="{Binding Path=df_elementSet}" ItemTemplate="{StaticResource ElementTemplate}"> 
     </HierarchicalDataTemplate> 

    </ResourceDictionary> 
</UserControl.Resources> 

<Grid> 
    <ListBox ItemsSource="{StaticResource TheData}" ItemTemplate="{StaticResource ElementSetTemplate}"> 
    </ListBox> 
</Grid> 

这里是代码隐藏在正在加载的XML数据:

private DataSet m_dataSet; 
    private ObjectDataProvider mODP; 

    public void LoadXml(EditorContext context, XmlValidator.Context validator, XmlDocument doc) 
    { 
     mODP = FindResource("TheData") as ObjectDataProvider; 

     XmlSerializer xs = new XmlSerializer(typeof(DataSet)); 
     XmlReader r = new XmlNodeReader(doc.DocumentElement); 
     m_dataSet = (DataSet)xs.Deserialize(r); 

     mODP.ObjectInstance = m_dataSet; 
    } 

期望的结果是该ListBox将为数据结构中的每个元素都有一个TextBox。请注意,由于某种原因,数据结构是分层的。我无法将数据结构扁平化以简化问题。

我确定xml数据正在正确加载到数据结构中,因为我可以放置一个断点并检查它,并且所有数据看起来都很好。但是当我运行程序时,ListBox中什么也没有显示出来。

任何帮助表示赞赏。

回答

3

我想出了我做错的事情。有几件事是错误的。这里的要点:

1)我应该使用一个ItemsControl已经

2)我并不需要使用HierarchicalDataTemplate

3)我需要三个层次的控制:内部的一个TextBox itemsControl中的itemsControl ...可以使用两个DataTemplates完成。顶级itemsControl引用包含内部itemsControl的DataTemplate。该itemsControl然后引用一个DataTemplate持有一个内部TextBox。

这里是正确的XAML:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ObjectDataProvider x:Key="TheData" /> 

     <DataTemplate x:Key="ElementTemplate"> 
      <TextBox Text="{Binding Path=df_myValue}"/> 
     </DataTemplate> 

     <DataTemplate x:Key="ElementSetTemplate"> 
      <GroupBox Header="I am a GroupBox"> 
       <ItemsControl ItemsSource="{Binding Path=df_elementSet}" ItemTemplate="{StaticResource ElementTemplate}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
      </GroupBox> 
     </DataTemplate> 

    </ResourceDictionary> 
</UserControl.Resources> 

<Grid> 
    <ItemsControl ItemsSource="{Binding Source={StaticResource TheData}, Path=df_basicSet}" ItemTemplate="{StaticResource ElementSetTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 

希望这可以帮助其他人...

+0

正是我一直在寻找,感谢随访。 – 2013-05-16 16:15:29