【问题标题】:Binding Hierarchical TreeView To Dictionary将分层 TreeView 绑定到字典
【发布时间】:2014-10-12 22:37:49
【问题描述】:

我正在尝试让我的 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>

我的视图模型:

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

我得到的是一个永远不会更新的空白树视图。每当我向该单例管理器实例中的“FolderDirectory”添加新项目时,我都会调用 OnPropertyChanged。这适用于我绑定到该字典或文件夹项的任何其他内容。

我试图遵循这一点,但是绑定如何观察到它自动将“FamilyMembers”列表作为子项使我无法理解,因为您在任何地方都没有明确告诉 XAML 模板它应该将 itemsource 绑定到该集合。 http://www.wpf-tutorial.com/treeview-control/treeview-data-binding-multiple-templates/

编辑: 控件肯定会从我的单例中获取所有值。我只是在玩弄绑定路径的命名,当我不小心将 TreeView 设置为绑定到 m_FolderList.Value (字典有值,而不仅仅是值)时,它给了我控制台中的绑定错误,就像里面的项目一样多字典。

EDIT2:

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

如果我这样做,而不是字典,则会出现第一级信息......这很麻烦

【问题讨论】:

    标签: c# wpf dictionary treeview


    【解决方案1】:
    public List<Folder> m_FolderList
    {
            get
            {
    
                    List<Folder> list = new List<Process>();
                    list.AddRange(Manager.Instance.GetFolderDirectory().Values);
                    return list;
            }
    }
    

    我讨厌这样做,但它是唯一适用于 Heirarchical 模板的方法。我之前多次使用绑定到字典 Path=Value ,但它只是拒绝在这种情况下工作,并进行了多次尝试。它不是最好的答案,但它是我目前唯一有效的答案。

    【讨论】:

      【解决方案2】:

      试试这个

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

      输出

      【讨论】:

      • 这很奇怪,它根本没有给我任何东西。当我从 Dictionary 更改为 List,并手动迭代 Dictionary 值以将它们插入基本 List 时,它可以正常工作。 (显然绑定中没有 Value)
      • 你为什么使用字典?为什么不使用 List.
      • 因为我用字典管理文件夹的集合(很大),我需要按 ID 查找。除非我想保留 2 个相同数据的副本,否则 List 不利于 1000 多个项目
      • 即使使用 List,出于某种原因,项目也不会显示为子项。
      • 好吧,我以为你这样做是因为 TreeView,因为它没有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多