2013-04-04 72 views
3

我需要用我有的詞典列表填寫一個TreeView。C#WPF - 與詞典的TreeView綁定

​​

凡字典有標題和孩子鍵

[{"title":"foo", "children":[]},] 

但是我無法找出具有約束力。這是完全錯誤的。我顯然需要顯示dict [「title」]並使用dict [「children」]作爲孩子。

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Value}"> 
     <HierarchicalDataTemplate.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"/> 
      </DataTemplate> 
     </HierarchicalDataTemplate.ItemTemplate> 
     <TextBlock Text="{Binding Key}"/> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

哈所以顯然綁定支持[]語法,因此這類作品:

 <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=[children]}"> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=[title]}"/> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
       <TextBlock Text="{Binding Path=[title]}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 

每個字典可以有孩子嵌套但是他們想然而許多層面。這是可以處理的嗎?通過上面的模板和下面的代碼,不會顯示盛大的孩子。

 string s = @"[{""title"":""Title1"",""children"":[{""title"":""Child1"",""children"":[{""title"":""grandchild1"",""children"":[]}]}]}]"; 

     List<Dictionary<string, object>> marr = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(s); 
     mTreeView.ItemsSource = marr; 

通過在綁定使用[]的方式被稱爲索引,我從文檔發現了它在此鏈接:

http://msdn.microsoft.com/en-us/library/ms752300.aspx#Path_Syntax

+0

你需要一個轉換器,它可以通過一個特定的鍵從字典中獲取/設置值。有了這樣一個轉換器,你可以按照以下方式進行綁定:'{Binding Converter = {StaticResource GetFromDictionaryConverter},ConverterParameter = children}'或'{Binding Converter = {StaticResource GetFromDictionaryConverter},ConverterParameter = title}',假設轉換器已被添加爲具有關鍵字'GetFromDictionaryConverter'的資源並且它使用轉換器參數作爲關鍵字並且假定綁定源是'Dictionary'。 –

回答

1

這是不是你正在尋找:

<TreeView ItemsSource="{Binding ElementName=rootWindow, Path=Directories}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding [Children]}"> 
       <TextBlock Text="{Binding [Title]}" /> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding}" /> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

這是我如何填充數據:

Dictionary<string, object> documentsDictionary = new Dictionary<string, object>(); 
     List<string> documentsDictionaryChildren = new List<string> { "Document1", "Document2", "Document3", "Document4", "Document5" }; 
     documentsDictionary.Add("Title", "Documents"); 
     documentsDictionary.Add("Children", documentsDictionaryChildren); 

     Dictionary<string, object> picturesDictionary = new Dictionary<string, object>(); 
     List<string> picturesDictionaryChildren = new List<string> { "Picture1", "Picture2", "Picture3", "Picture4", "Picture5" }; 
     picturesDictionary.Add("Title", "Pictures"); 
     picturesDictionary.Add("Children", picturesDictionaryChildren); 

     Directories.Add(documentsDictionary); 
     Directories.Add(picturesDictionary); 
+0

我在找到相似的答案後才編輯了問題。不過,我的字典列表可以嵌套到任意級別。看來你只有一個級別的孩子。 – Mark

+0

如果你的孩子節點還有孩子,你的模板應該等待嗎? – Mark