将分层TreeView绑定到Dictionary

时间:2014-08-19 18:00:18

标签: c# wpf dictionary treeview

我试图让我的TreeView绑定到将要更新的词典。我已经在数据类型本身上实现了INotifyProperyChangedHandler,但这会影响树视图吗?

我的目标是:

-FolderName
--->Item1
--->Item2
-FolderName
--->Item1

这是我的观点:

<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:

    public Dictionary<UInt16, Folder> m_FolderList
    {
        get { return Manager.Instance.GetFolderDirectory(); }
    }

我的文件夹类:

public class Folder
{
     public m_Name { get; set; }
     public ObservableCollection<String> m_Items { get; set; }
}

我得到的是一张永不更新的空白树视图。每当我向&#34; FolderDirectory&#34;添加新项目时在那个单例管理器实例中,我做了一个OnPropertyChanged调用。这适用于我已经绑定到该词典或文件夹项目的任何其他内容。

我试图遵循这一点,但绑定如何观察它自动生成孩子们的家庭成员&#34; list逃避了我,因为你没有明确地告诉XAML模板它应该将itemsource绑定到该集合。 http://www.wpf-tutorial.com/treeview-control/treeview-data-binding-multiple-templates/

编辑: 控制肯定是从我的单身人士获得所有价值。我只是在玩Binding Path的命名,当我意外地将TreeView设置为绑定到m_FolderList.Value(字典有值,而不仅仅是Value)时,它在控制台中给出了尽可能多的绑定错误。字典。

EDIT2:

public List<Folder> m_FolderList
{
  get
  {
    List<Folder> list = new List<Folder>();
    list.AddRange(Manager.Instace.GetFolderDirectory().Values);
    return list;
  }
}

如果我这样做,而不是字典,则会出现第一级信息......这是一件令人讨厌的事情

2 个答案:

答案 0 :(得分:0)

试试这个

    <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>
  

输出   enter image description here

答案 1 :(得分:0)

public List<Folder> m_FolderList
{
        get
        {

                List<Folder> list = new List<Process>();
                list.AddRange(Manager.Instance.GetFolderDirectory().Values);
                return list;
        }
}

我讨厌这样做,但它是使用Heirarchical模板的唯一方法。我曾经多次使用绑定到字典Path = Value但它只是拒绝在这个实例中工作很多次尝试。它不是最好的答案,但它是我目前唯一的工作方式。