Вложенная древовидная структура XAML со смешанными типами объектов - PullRequest
0 голосов
/ 29 июня 2018

Итак, я работал над сложной древовидной структурой, используя привязку WPF. Ни один из сценариев, которые я нашел в Интернете, не смог решить проблему, но они приблизились.

Итак, у меня есть три объекта, которые выглядят примерно так:

public class A
{
    public string Name {get; set;}
    public List<A> ListOfA {get; set;}
    public List<B> ListOfB {get; set;}
}

public class B
{
    public string Name {get; set;}
    public List<C> ListOfC {get; set;}
    public List<D> ListOfD {get; set;}
}

public class C
{
    public string Name {get; set;} 
    public List<D> {get; set;}
}

public class D
{
    public string Name{get; set;}
} 

Следует отметить, что ListOfA, ListOfB, ListOfC и ListOfD могут быть пустыми. Я знаю, что это кажется запутанным, но для моего приложения вполне понятно, почему я так поступлю.

Ниже приведен пример того, как может выглядеть древовидное представление

A - Name
    | - A - Name
        | - B - Name
            | - D - Name
            | - D - Name
            | - D - Name
        | - A - Name
            | - B - Name
                | - C - Name
                    | - D - Name
                    | - D - Name
        | - A - Name
    | - A - Name
        | - A - Name
        | - A - Name
    | - A - Name

Итак, я выяснил, как отформатировать древовидную структуру A и B, как показано ниже в классе A.

public IList Children
    {
        get
        {
            return new CompositeCollection()
            {
                new CollectionContainer() { Collection = ListOfA },
                new CollectionContainer() { Collection = ListOfB }
            };
        }
    }
}

Что я получил от этого вопроса: WPF Treeview Databinding Hierarchal Data со смешанными типами

Ниже приведен мой код XAML, заменяющий реальные объекты A / B / C. Примечание ListOfA является членом модели представления.

<TreeView ItemsSource = "{Binding Children}">
    <TreeView.Resources>

        <HierarchicalDataTemplate DataType="{x:Type local:A}" 
         ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding}"/>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type local:B}" 
        ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}"/>
      </HierarchicalDataTemplate>

    </TreeView.Resources>
</TreeView>

Это прекрасно работает, но я не могу понять, как функционально добавить D в это древовидное представление. Я смог сделать это, добавив элемент древовидного представления с вложенным древовидным представлением, содержащим ListOfD внутри HierarchicalDataTemplate для типа B, но я знаю, что это не очень хороший способ сделать это.

Я также попытался добавить что-то вроде:

<DataTemplate DataType={x:Type local:D>
    <TextBlock Text={Binding Name}/>
</DataTemplate>

Но это не работает, я полагаю, потому что не у каждого потомка этого объекта 'Children' нет объекта типа D внутри него. Я также не уверен, как обращаться с объектом типа C, но сейчас я больше сосредоточен на D, и готов поспорить, что я знаю, как справиться с этим, как только я заставлю D работать в любом случае.

Я делаю это сложнее, чем нужно, или я на правильном пути, вкладывая вещи в шаблон иерархических данных?

1 Ответ

0 голосов
/ 29 июня 2018

C просто нужен шаблон, который выглядит как

<HierarchicalDataTemplate DataType="{x:Type local:C}" ItemsSource="{Binding ListOfD}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>

так что в итоге вы получите:

<HierarchicalDataTemplate DataType="{x:Type local:A}" ItemsSource="{Binding Children}">
    <TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:B}" ItemsSource="{Binding Children}">
     <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:C}" ItemsSource="{Binding ListOfD}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplateDataType="{x:Type local:D}">
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

и ваши классы:

public class A
{
    public string Name {get; set;}
    public List<A> ListOfA {get; set;}
    public List<B> ListOfB {get; set;}
    public IList Children
    {
        get
        {
            return new CompositeCollection()
            {
                new CollectionContainer() { Collection = ListOfA },
                new CollectionContainer() { Collection = ListOfB }
            };
        }
    }
}

public class B
{
    public string Name {get; set;}
    public List<C> ListOfC {get; set;}
    public List<D> ListOfD {get; set;}
    public IList Children
    {
        get
        {
            return new CompositeCollection()
            {
                new CollectionContainer() { Collection = ListOfC },
                new CollectionContainer() { Collection = ListOfD }
            };
        }
    }
}

public class C
{
    public string Name {get; set;} 
    public List<D> ListOfD {get; set;}
}

public class D
{
    public string Name{get; set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...