如果数据是按集合组织的,则可以使用HierarchicalDataTemplates填充TreeView。但是我有一些数据,保存在几个知名的类中,需要在TreeView中显示。这是一个代码示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
namespace Test
{
public class GroupWithList
{
public string Name { get; set; }
public ObservableCollection<string> Items { get; set; }
public GroupWithList(string name)
{
this.Name = name;
this.Items = new ObservableCollection<string>();
}
}
public class GroupWith2Children
{
public string Name { get; set; }
public ObservableCollection<GroupWithList> Groups { get; set; }
public GroupWithList First
{
get
{
return this.Groups[0];
}
}
public GroupWithList Second
{
get
{
return this.Groups[1];
}
}
public GroupWith2Children()
{
this.Name = "GroupWith2Children";
this.Groups = new ObservableCollection<GroupWithList>();
GroupWithList g;
g = new GroupWithList("Letters");
g.Items.Add("u");
g.Items.Add("a");
g.Items.Add("t");
this.Groups.Add(g);
g = new GroupWithList("Numbers");
g.Items.Add("12");
g.Items.Add("153");
this.Groups.Add(g);
}
}
}
public partial class MainWindow : Window
{
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<GroupWith2Children>), typeof(MainWindow), new FrameworkPropertyMetadata(new ObservableCollection<GroupWith2Children>()));
public ObservableCollection<GroupWith2Children> Items
{
get
{
return (ObservableCollection<GroupWith2Children>)this.GetValue(ItemsProperty);
}
set
{
this.SetValue(ItemsProperty, value);
}
}
public MainWindow()
{
InitializeComponent();
this.Items.Add(new GroupWith2Children());
this.Items.Add(new GroupWith2Children());
}
}
这是xaml代码:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:test="clr-namespace:Test"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<DataTemplate DataType="{x:Type test:GroupWith2Children}">
<TreeViewItem Header="{Binding Mode=OneWay, Path=Name}">
<TreeViewItem Header="First" ItemsSource="{Binding Mode=OneWay, Path=First.Items}"/>
<TreeViewItem Header="Second" ItemsSource="{Binding Mode=OneWay, Path=Second.Items}"/>
</TreeViewItem>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type test:GroupWithList}" ItemsSource="{Binding Path=Items}">
<TextBlock Text="GroupWithList"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type sys:String}">
<TextBlock Text="{Binding}"/>
</DataTemplate>
</Grid.Resources>
<TreeView>
<TreeViewItem Header="Root" ItemsSource="{Binding Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=Items}"/>
</TreeView>
</Grid>
</Window>
该示例工作正常,但您无法选择在GroupWith2Children的DataTemplate中生成的项目。似乎TreeView将整个模板视为一项。您只能选择根节点和整个子树“ GroupWith2Children”。
用集合替换GroupWith2Children不是我的选择。任何想法,我在做什么错?
最佳答案
您不必将GroupWith2Children
替换为集合。您可以实现一个可枚举的属性。如果根本无法触摸GroupWith2Children
类,请实现包装类:
public class GroupWrapper()
{
public GroupWrapper(GroupWith2Children group)
{
Group = group;
}
public GroupWith2Children Group { get; private set; ]
public IEnumerable<GroupWithList> Groups
{
get
{
yield return Group.First;
yield return Group.Second;
}
}
}