所以我一直在研究使用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正常工作,我都会知道如何处理它。
我是在使它变得比它所需要的困难吗?还是我在将数据嵌套在“层次数据模板”中的正确轨道上?
答案 0 :(得分:3)
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;}
}