我遇到了以下问题,我现在已经挣扎了大约5个小时。
如何将以下类结构正确绑定到TreeView?
public class Person
{
public string Display { get; set; }
public List<Car> Cars { get; set; }
public List<House> Houses { get; set; }
}
public class Car
{
public string Display { get; set; }
}
public class House
{
public string Display { get; set; }
}
我希望TreeView具有以下结构:(1号人物既有房子又有车,2号人物只有房子)
- Person #1
|-- Cars
|-- Car #1
|-- Car #2
|-- Houses
|-- House #1
- Person #2
|-- Houses
|-- House #1
|-- House #2
你到底是如何在XAML中自动绑定到ObservableCollection的?我在Treeview(UserControl)的Constructor中只设置了一次绑定,如下所示:
this.ItemsSource = SomeStaticClass.People;
非常感谢您的帮助!谢谢!=)
编辑:我尝试了层次结构数据模板,但无法使其工作;)
编辑2:我尝试了很多不同的东西,但最接近的是以下代码(此时只考虑一个枚举;):
<HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Cars}">
<TextBlock Text="{Binding Display}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Cars}">
<TextBlock Text="Cars" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Display}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
不幸的是,它没有显示TextBlock汽车和汽车本身。我该怎么做?
最终解决。我刚刚在我的个人和汽车(分别为主页)之间插入了另一个类集合,如下所示:
public class CollectionHolder<T> : IEnumerable
{
public List<T> Items { get; set; }
public string Display { get; set; }
private List<CollectionHolder<T>> self;
public CollectionHolder()
{
self = new List<CollectionHolder<T>>();
self.add(this);
}
public IEnumerator GetEnumerator()
{
return self.GetEnumerator();
}
}
比个人类:
public class Person
{
public string Display { get; set; }
public CollectionHolder<Car> Cars { get; set; }
public CollectionHolder<House> Houses { get; set; }
public IList Children
{
get
{
return new CompositeCollection
{
new CollectionContainer { Collection = Cars },
new CollectionContainer { Collection = Houses }
});//In real world: don't generate the list everytime!
}
}
}
最后是我的XAML:
<TreeView x:Name="trvData" Grid.Row="0" BorderThickness="0,0,0,1">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Display}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Display}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Display}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>