2013-04-04 75 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