Binding Hierarchical TreeView To Dictionary
我正在尝试让TreeView绑定到将要更新的Dictionary。我已经在数据类型本身上实现了INotifyProperyChangedHandler,但是这会完全影响树视图吗?
我的目标是:
1 2 3 4 5 | -FolderName --->Item1 --->Item2 -FolderName --->Item1 |
这是我的观点:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <UserControl.Resources> <HierarchicalDataTemplate x:Key="ChildTemplate"> <TextBlock FontStyle="Italic" Text="{Binding Path=m_Items}" /> </HierarchicalDataTemplate> <HierarchicalDataTemplate x:Key="NameTemplate" ItemsSource="{Binding Path=Value}" ItemTemplate="{StaticResource ChildTemplate}"> <TextBlock Foreground="White" Text="{Binding m_Name}" FontWeight="Bold" /> </HierarchicalDataTemplate> </UserControl.Resources> <TreeView x:Name="NewTree" ItemsSource="{Binding m_FolderList, UpdateSourceTrigger=PropertyChanged}" ItemTemplate="{StaticResource NameTemplate}"> </TreeView> |
我的ViewModel:
1 2 3 4 | public Dictionary<UInt16, Folder> m_FolderList { get { return Manager.Instance.GetFolderDirectory(); } } |
我的文件夹类:
1 2 3 4 5 | public class Folder { public m_Name { get; set; } public ObservableCollection<String> m_Items { get; set; } } |
我得到的是一个永远不会更新的空白树视图。每当我在该单例管理器实例中将新项目添加到" FolderDirectory"时,我都会执行OnPropertyChanged调用。这对我一直绑定到该词典或文件夹项目的其他任何项目都有效。
我尝试遵循此步骤,但是绑定如何观察到它自动成为" FamilyMembers"列表的子项,这使我无所适从,因为您没有明确地告诉XAML模板它将项目源绑定到该集合。 http://www.wpf-tutorial.com/treeview-control/treeview-data-binding-multiple-templates/
编辑:
该控件肯定是从我的单例中获取所有值的。我只是在玩弄绑定路径的命名,当我不小心将TreeView设置为绑定到m_FolderList.Value(字典中包含Values,而不仅仅是Value)时,它在控制台中给我的绑定错误与在其中的Items一样多。字典。
EDIT2:
1 2 3 4 5 6 7 8 9 | public List<Folder> m_FolderList { get { List<Folder> list = new List<Folder>(); list.AddRange(Manager.Instace.GetFolderDirectory().Values); return list; } } |
如果我这样做,而不是字典,则会出现第一级信息...这是令人讨厌的事情
1 2 3 4 5 6 7 8 9 10 | public List<Folder> m_FolderList { get { List<Folder> list = new List<Process>(); list.AddRange(Manager.Instance.GetFolderDirectory().Values); return list; } } |
我讨厌这样做,但这是唯一与Heirarchical模板一起使用的方法。我已经使用过多次绑定到字典Path = Value的方法,但是在很多情况下它只是拒绝在这种情况下工作。这不是最好的答案,但它是我目前唯一可行的答案。
试试这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <Window.Resources> <DataTemplate x:Key="secondLevel"> <TextBlock Text="{Binding}"/> </DataTemplate> <HierarchicalDataTemplate x:Key="topLevel" ItemsSource="{Binding Value.m_Items}" ItemTemplate="{StaticResource secondLevel}"> <TextBlock Text="{Binding Value.m_Name}"> </TextBlock> </HierarchicalDataTemplate> </Window.Resources> <StackPanel> <TreeView x:Name="FolderTree" ItemsSource="{Binding m_FolderList}" ItemTemplate="{StaticResource topLevel}"> </TreeView> </StackPanel> |
output