2015-02-11 81 views
0

我正在试图制作一个表示来自文件的数据的树形视图。文件数据具有分为三个不同部分的数据包:标题信息,操作标题和操作数据。 Header Info和Operation Header中的数据包是一层深度的,而Operation Data中的数据包则被分组成列表,所以我认为通过增加一个额外的级别可以更容易地进行组织。这样你可以打开数据,查看列表,并弹出打开的数据包。在WPF中遇到绑定到treeview的问题

这是我的XAML:

<TreeView ItemsSource="{Binding TreeViewItems}"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding TreeNodes}"> 
        <TextBlock Text="{Binding Name}" /> 

        <HierarchicalDataTemplate.ItemTemplate> 
         <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
          <TextBlock Text="{Binding Name}" /> 

            <HierarchicalDataTemplate.ItemTemplate> 
             <HierarchicalDataTemplate> 
              <TextBlock Text="{Binding DataPackets.ItemName}"/>             
             </HierarchicalDataTemplate> 
            </HierarchicalDataTemplate.ItemTemplate> 

         </HierarchicalDataTemplate> 
        </HierarchicalDataTemplate.ItemTemplate> 

       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 

这里是我们正试图绑定到分层的DataTemplates代码:

   var childData = new Children(); 

       result.OperationData.ToList().ForEach(x => childData.DataPackets.Add(x)); 


       if (result.HeaderInfo.Any()) 
       { 
        TreeViewItems.Add(new TreePair() { TreeNodes = result.HeaderInfoProperties.ToList(), Name = "Header Info" }); 
       } 
       TreeViewItems.Add(new TreePair() { TreeNodes = result.OperationHeaderProperties.ToList(), Name = "Operation Header" }); 
       TreeViewItems.Add(new TreePair() { TreeNodes = result.OperationDataProperties.ToList(), Children = new List<Children> {childData}, Name = "Operation Data" }); 

和类

public class TreePair 
    { 


     public TreePair() 
     {    
      TreeNodes = new List<PropertyInfo>(); 
      Children = new List<Children>(); 
     } 

     public List<Children> Children { get; set; } 

     public List<PropertyInfo> TreeNodes { get; set; } 

     public string Name { get; set; } 
    } 

    public class Children 
    { 
     public Children() 
     { 
      DataPackets = new List<DataPacketBase>(); 
     } 

     public string Name { get; set; } 

     public List<DataPacketBase> DataPackets { get; set; } 
    } 

我有显示标题信息和操作标题的数据包,以及操作数据的列表名称没有一个子数据包出现。它们存在于Children.DataPackets对象中。

这是扔在输出窗口: BindingExpression路径错误:在“对象”

第二TextBlock的是正确的,但孩子的ItemSource是不是被发现,但名单中没有找到“儿童”属性充满了物品。

enter image description here

儿童Name属性丢失从二级

enter image description here

回答

1

结合不会找到Children,因为它正在寻找它PropertyInfo对象。 ChildrenTreeNodes是树中的兄弟姐妹,两者之间没有子/父关系,因此HierarchicalDataTemplate在尝试查找属于PropertyInfo对象的Children对象时中断。

如果您的对象层次结构是正确的,那么您需要一个CompositeCollection,它可以将TreeNodes和Children对象组合到一个集合中。

private CompositeCollection _treeNodeChildCollections; 
    public CompositeCollection TreeNodeChildCollections 
    { 
     get 
     { 
      if (_treeNodeChildCollections == null) 
      { 
       _treeNodeChildCollections = new CompositeCollection(); 
       var cc1 = new CollectionContainer(); 
       cc1.Collection = Children; 
       var cc2 = new CollectionContainer(); 
       cc2.Collection = TreeNodes; 

       _treeNodeChildCollections.Add(cc1); 
       _treeNodeChildCollections.Add(cc2); 
      } 

      return _treeNodeChildCollections; 
     } 
    } 

然后绑定到xaml。

<TreeView ItemsSource="{Binding TreeViewItems}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding TreeNodeChildCollections}"> 
       <TextBlock Text="{Binding Name}" /> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding DataPackets}"> 
         <TextBlock Text="{Binding Name}"/> 
         <HierarchicalDataTemplate.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding ItemName}"/> 
          </DataTemplate> 
         </HierarchicalDataTemplate.ItemTemplate> 
        </HierarchicalDataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
+0

这几乎有它,它显示所有三个级别,但第二级字符串“名称是失踪”?第一级文本块绑定到名为Name的属性,第二级文本块应该绑定到另一个名为name的属性,第三级应绑定到名为ItemName的文本块。第二级项目在树形视图中,但名称不显示。 – user1307149 2015-02-12 02:23:37

+1

那么哪些项目不显示他们的名字? – nmaait 2015-02-12 02:28:04

+0

我更新了底部显示第二级字符串名称缺失的图像的问题。我应该是儿童的名字财产。 – user1307149 2015-02-12 02:28:47