WPF TreeView 绑定不同级别的多个不同字典并通过 TKey 对它们进行排序

WPF TreeView binding multiple different dictionaries in different levels and sorting them by TKey

我有这些模型:

public class CustomerGroup
  {
      public string GroupName { get; set; }
      public string GroupKey { get; set; }
  }
  public class Customer
  {
      public string GroupKey { get; set; }
      public string CustomerKey { get; set; }
      public string CustomerName { get; set; }
      // and more irrelevant stuff for my question...
  }
  public class ConstructionSite 
  {
      public string CustomerKey { get; set; }
      public string GroupeKey { get; set; }
      public string ConstructionSiteName { get; set; }
      // and more irrelevant stuff for my question...
  }

我有这些词典:

public class CustomerGroupList : List<CustomerGroup>
{
   // Methods for Serialization etc.
}
public class CustomersDictionary : SortedDictionary<string, List<Customer>> // TKey is GroupKey
{
   // Methods for Serialization etc.
}
public class ConstructionSiteDictionary : SortedDictionary<string, List<ConstructionSite>> // TKey is customerKey
{
   // Methods for Serialization etc.
}

所以客户的字典包含 groupKey 作为 TKey 和该组的客户列表作为值。 建筑工地字典包含 CustomerKey 作为 TKey 和该客户的建筑工地列表作为值。 字典存储在静态 class

现在我想将这些词典绑定为树视图的来源,它应该如下所示:

-CustomerGroupOne
  -CustomerOne
    -Construction site A
    -Construction site B
  -CustomerTwo
    -ConSite C
-GroupTwo
  -CustomerThree

所以我找到了绑定数据的解决方案,但是我不知道如何使用上层节点的键从字典中获取列表。 我预计它会像这样工作:

<TreeView x:Name="treeView" ItemsSource="{Binding Source={x:Static dataServices:DataProviderService.CustomerGroupsList}}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate>
            <Label Content="{Binding GroupName}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Source={x:Static dataServices:DataProviderService.CustomersDictionary[GroupKeyOfUpperNodesCurrentGroup]}}">
                    <Label Content="{Binding CustomerName}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Source={x:Static dataServices:DataProviderService.ConstructionSiteDictionary[CustomerKeyOfUpperNodesCorrentCustomer]}}">
                            <TextBlock Text="{Binding ConstructionSiteName}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

我希望有人能帮助我。谢谢你的帮助! 抱歉英语不好... 我现在要去上学,刚开始接触 C# 一年多一点...

顾名思义,TreeView控件显示一个数据结构。但是字典是键值对的平面集合。显然 Dictionary 来自数据源。您必须将字典转换为适当的分层数据结构。建议让您的数据实体反映分层数据结构。可以通过向数据模型添加子集合来实现分层数据结构:

分层数据结构

public class CustomerGroup
{
  // Define a child collection
  public ObservableCollection<Customer> Customers { get; set; }

  public string GroupName { get; set; }
  public string GroupKey { get; set; }
}

public class Customer
{
  // Define a child collection
  public ObservableCollection<ConstructionSite> ConstructionSites { get; set; }

  public string GroupKey { get; set; }
  public string CustomerKey { get; set; }
  public string CustomerName { get; set; }
  // and more irrelevant stuff for my question...
}

public class ConstructionSite 
{
  public string CustomerKey { get; set; }
  public string GroupeKey { get; set; }
  public string ConstructionSiteName { get; set; }
  // and more irrelevant stuff for my question...
}

DataSourceViewModel.cs

class DataSourceViewModel:INot6ifyPropertyChanged { public ObservableCollection CustomerGroups { 得到; }

public DataSourceViewModel() { this.CustomerGroups = 新的 ObservableCollection() { 新客户组 { CustomerGroupName = "CustomerGroupOne", 客户 = 新客户 { CustomerName = "CustomerOne", ConstructionSites = new ConstructionSite {ConstructionSiteName = "施工现场A"} } } }; }

MainWindow.xaml
定义HieratchicalDataTemplates显示结构and
DataSourceViewModel 作为非静态绑定源分配给 DataContext

<Window>
  <Window.DataContext>
    <DataSourceViewModel />
  </Window.DataContext>
  <TreeView ItemsSource="{Binding CustomerGroups}">
    <TreeView.Resources>
    
      <!-- Root node -->
      <HierarchicalDataTemplate DataType={x:Type CustomerGroup}" 
                                ItemsSource="{Binding Customers}">
        <TextBlock Text="{Binding GroupName}" />
      </HierarchicalDataTemplate>

      <HierarchicalDataTemplate DataType={x:Type Customer}" 
                                ItemsSource="{Binding ConstructionSites}">
        <TextBlock Text="{Binding CustomerName}" />
      </HierarchicalDataTemplate>

      <!-- Leaf node -->
      <DataTemplate DataType={x:Type ConstructionSite}>
        <TextBlock Text="{Binding ConstructionSitesName}" />
      </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
  </TreeView>
</Window>