2015-02-11 39 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