我需要用我拥有的字典列表填充一个TreeView。
每个字典都可以嵌套到任意层级,但是如何处理呢?使用上述模板和以下代码,无法显示孙子级别的内容。
List<Dictionary<string,object>>
在字典中,有标题和子键
[{"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>
听说 Binding 支持 [] 语法,所以这样做似乎有用:
<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
{Binding Converter={StaticResource GetFromDictionaryConverter}, ConverterParameter=children}
或{Binding Converter={StaticResource GetFromDictionaryConverter}, ConverterParameter=title}
,假设该转换器已添加为具有键GetFromDictionaryConverter
的资源,并且它使用转换器参数作为键,并假定绑定源是一个Dictionary
。 - odyss-jii