关于c#:将分层TreeView绑定到字典

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