嵌套的XAML树视图结构与混合对象类型

所以我一直在研究使用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类中使用类似下面的格式来格式化A和B的树形视图.

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

从这个问题中我得到了:WPF Treeview Databinding Hierarchal Data with mixed types

下面是我的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包含在类型B的HierarchicalDataTemplate中,但是我知道这不是一个好方法.

我也尝试添加以下内容:

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

但这是行不通的,我认为是因为并非该“孩子”对象的每个孩子在其中都没有D型对象.我也不确定如何处理C类型的对象,但是我现在更专注于D,并且愿意打赌,无论如何,只要D起作用,我就会知道如何处理它.

我是在使它变得比它所需要的更难,还是在层次结构数据模板中嵌套事物的正确轨道上?

解决方法:

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;}
}
上一篇:javascript-如何在引导树视图中构建href?


下一篇:[C#] [WPF]如何在不冻结UI的情况下制作异步TreeView?