Иерархия treeView c 3-м уровнем вложенности

248
15 сентября 2018, 16:50

Помогите разобраться. как корректно построить иерархию для 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>
Answer 1

Нашла следующее решение (сами данные немного изменились, не сервер а система, но подход тот же):

Код 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(); 

Информация по решению отсюда

READ ALSO
RefreshToken в JWT

RefreshToken в JWT

По ответам из этого вопроса я понял как создавать jwt токенНо теперь встал вопрос, как его неявно обновлять

225
Контекст выполнения операции

Контекст выполнения операции

Есть класс Dispatcher с набором public методов, которые вызываются извнеКаждый из методов - задача(Func<Task>), запускаемая в очереди (в один момент...

211
Изменить данные XML файла

Изменить данные XML файла

Нужно из xml файла получать данные, по нажатию кнопки менять значение на 2 (+2)А вот как изменять данные из файла найти не могу нормально

243