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