Помогите разобраться. как корректно построить иерархию для 3 вложенности в treeview, а именно для 3 классов, описывающих таблицы БД (entity framework):
Класс Заказчик:
public partial class Customer
{
public Customer()
{
this.Consignee = new HashSet<Consignee>();
}
public int idCustomer { get; set; }
public string nameCustomer { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Consignee> Consignee { get; set; }
}
Класс Полигон:
public partial class Consignee
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Consignee()
{
this.Servers = new HashSet<Servers>();
this.Systems = new HashSet<Systems>();
}
public int idConsignee { get; set; }
public int idCustomerConsignee { get; set; }
public string nameConsignee { get; set; }
public virtual Customer Customer { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Servers> Servers { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Systems> Systems { get; set; }
}
Класс Сервер:
public partial class Servers
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Servers()
{
this.Licence = new HashSet<Licence>();
}
public string idUidServer { get; set; }
public string ipServer { get; set; }
public Nullable<int> idConsigneeServer { get; set; }
public virtual Consignee Consignee { get; set; }
}
Код XAML для иерархии Заказчик-Полигон:
<TreeView x:Name="tvForLic">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path = Consignee}" >
<TextBlock Text="{Binding Path= nameCustomer}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= nameConsignee}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Как ее модифицировать, чтобы получить иерархию вида:
Мои наработки по теме ниже:
<TreeView x:Name="tvForSystem" ItemsSource="{Binding Consignee}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Systems}" ItemsSource="{Binding Consignee}">
<StackPanel Orientation="Horizontal">
<CheckBox Margin="2" />
<TextBlock Text="{Binding nameSystem}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Customer}" ItemsSource="{Binding Consignee}">
<StackPanel Orientation="Horizontal">
<CheckBox Margin="2" />
<TextBlock Text="{Binding nameCustomer}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Добавлено пространство имен в тег :
xmlns:local="clr-namespace:LicenseManager"
Попытка реализовать следующим образом тоже успеха не принесла
<TreeView x:Name="tvForSystem" ItemsSource="{Binding Consignee}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Customer}" ItemsSource="{Binding Consignee}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding nameCustomer}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Consignee}" ItemsSource="{Binding Consignee}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding nameConsignee}" />
</StackPanel>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:Systems}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding nameConsignee}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
Вариант, но выдает ошибку (Не удается применить объект типа "LicenseManager.Systems" к свойству, для которого требуется тип "System.Collections.IEnumerable"), хотя по сути этот класс содержит коллекцию.
<Window.Resources>
<local:Systems x:Key="theData"/>
<DataTemplate x:Key="level3">
<TextBlock Text="{Binding nameSystem}"/>
</DataTemplate>
<HierarchicalDataTemplate x:Key="level2"
ItemsSource="{Binding Consignee}"
ItemTemplate="{StaticResource level3}">
<TextBlock Text="{Binding nameConsignee}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="level1"
ItemsSource="{Binding Customer}"
ItemTemplate="{StaticResource level2}">
<TextBlock Text="{Binding nameCustomer}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<TreeView x:Name="tvForSystem"
ItemTemplate="{StaticResource level1}"
ItemsSource="{StaticResource theData}"
SelectedItemChanged="TvForLic_SelectedItemChanged">
</TreeView>
Нашла следующее решение (сами данные немного изменились, не сервер а система, но подход тот же):
Код XAML:
<TreeView Name="tvForSystem" ItemsSource="{Binding}">
<TreeView.Resources>
// Уровень с данными:
<DataTemplate x:Key="systemsTemplate" >
<TextBlock Text="{Binding Path=nameSystem}" />
</DataTemplate>
// Второй уровень:
<HierarchicalDataTemplate x:Key="consigneeTemplate"
ItemsSource="{Binding Path=Systems}"
ItemTemplate="{StaticResource ResourceKey=systemsTemplate}">
<TextBlock Text="{Binding Path=nameConsignee}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
// Третий уровень:
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Consignee}"
ItemTemplate="{StaticResource ResourceKey=consigneeTemplate}">
<TextBlock Text="{Binding Path=nameCustomer}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Наполнение компонента .cs (укладываем с список всю таблицу из БД "Заказчики"):
tvForSystem.DataContext = _db.Customer.ToList();
Информация по решению отсюда
Сборка персонального компьютера от Artline: умный выбор для современных пользователей