WPF TreeView связывает несколько разных словарей на разных уровнях и сортирует их по TKey

#c# #wpf #xaml #treeview

#c# #wpf #xaml #просмотр дерева

Вопрос:

У меня есть эти модели:

 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 и список строительных площадок для этого клиента в качестве значения.
И словари хранятся в статическом классе

Теперь я хочу привязать эти словари как источник treeview, и это должно выглядеть так:

 -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 # чуть больше года…

Комментарии:

1. Смотрите MVVM способ создания приложения WPF. Назначайте DataContext и больше не используйте статическое хранилище данных, потому что это недостаточно гибкий способ выполнения привязок. Тогда вы сможете играть с данными в классе C #. Другой способ решения — IValueConverter или IMultiValueConverter с MultiBinding помощью .

2. @aepot У вас есть какой-нибудь пример? Итак, я не могу сделать это в xaml и должен делать это программно?

3. Xaml — это murkup, а не язык программирования. Вы можете устанавливать отношения между пользовательским интерфейсом и данными, но не изменять структуру данных или устанавливать отношения между данными и другими данными. Короче говоря, если вы хотите установить дочерние узлы в категории, у вас должно быть это свойство в классе данных. Вы можете посмотреть примеры в www.

Ответ №1:

Как 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

класс DataSourceViewModel : INot6ifyPropertyChanged { общедоступная наблюдаемая коллекция CustomerGroups { get; }

общедоступный DataSourceViewModel() { this .CustomerGroups = new ObservableCollection() { новая пользовательская группа { Пользовательское групповое имя = «CustomerGroupOne», Клиенты = новый клиент { Пользовательское имя = «CustomerOne», ConstructionSites = новый строительный сайт {ConstructionSiteName = «Строительная площадка A»} } } }; }

MainWindow.xaml
Определите HieratchicalDataTemplates для отображения структуры и
назначения 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>