我需要填写一个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>
Hah很明显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;
顺便说一句,使用Binding中的[]称为索引器,我从这个链接的文档中找到了它:
http://msdn.microsoft.com/en-us/library/ms752300.aspx#Path_Syntax
答案 0 :(得分: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);