我有一组结构如下的数据:
ItemA.GroupA
ItemB.GroupA
ItemC.GroupB
ItemD.GroupC
我需要像这样在 WPF 树视图中显示数据:
A组
--- 项目A
--- 项目B
B组
--- 项目 C
C组
--- 项目 D
我可以使用什么 XAML 按不同的值对叶子进行分组?例如,集合中可能有多个项目,它们是 GroupA.ItemA,但是,我只想呈现节点和叶子一次。
我有一组结构如下的数据:
ItemA.GroupA
ItemB.GroupA
ItemC.GroupB
ItemD.GroupC
我需要像这样在 WPF 树视图中显示数据:
A组
--- 项目A
--- 项目B
B组
--- 项目 C
C组
--- 项目 D
我可以使用什么 XAML 按不同的值对叶子进行分组?例如,集合中可能有多个项目,它们是 GroupA.ItemA,但是,我只想呈现节点和叶子一次。
您将无法在 XAML 中做到这一点,至少不能以任何自然的方式。一个更好的方法是引入一个视图模型——一个以视图友好的方式表示数据的类,这样您就可以使您的 XAML 保持简单和自然。
因此,在您的情况下,您将拥有一个包装 ItemX 集合并公开组及其不同成员的类:
public class MyItemsViewModel
{
public IList<MyGroupViewModel> Groups { get; }
}
public class MyGroupViewModel
{
public string GroupName { get; }
public IList<MyItem> DistinctItems { get; }
}
然后,您的 HierarchicalDataTemplate 将几乎自动脱落。另一个好处是,因为您的视图模型类只是数据对象,您可以将它们置于自动化测试之下,而复杂的 XAML 则需要手动测试。
我不同意这里的itowlson。这不是一个毛茸茸的问题,HierarchicalDataTemplate
是为这种事情而设计的。在您随意深入研究模式和视图模型以及其他不必要的混淆之前,请考虑您的问题可以通过两个类和一个Linq GroupBy
语句来解决。
这是您的课程:
public class GroupItem
{
public string Name
{
get;
private set;
}
public string Group
{
get;
private set;
}
public GroupItem(string name, string group)
{
Name = name;
Group = group;
}
}
public class Group
{
public IEnumerable<GroupItem> Children
{
get;
set;
}
public string Name
{
get;
private set;
}
public Group(string name)
{
Name = name;
}
}
到现在为止还挺好。你有两个简单的类来保存所有必要的数据。名称和组存储为字符串。AGroup
有一个集合GroupItem
。现在为您的代码Window
:
public partial class DistinctLeaves : Window
{
public ObservableCollection<GroupItem> Items
{
get;
set;
}
public IEnumerable<Group> Groups
{
get;
set;
}
public DistinctLeaves()
{
Items = new ObservableCollection<GroupItem>();
Items.Add(new GroupItem("Item A", "Group A"));
Items.Add(new GroupItem("Item B", "Group A"));
Items.Add(new GroupItem("Item C", "Group B"));
Items.Add(new GroupItem("Item D", "Group C"));
Groups = Items.
GroupBy(i => i.Group).
Select(g => new Group(g.Key) { Children = g });
InitializeComponent();
}
}
再一次,除了 group-by 行之外,这都是样板。该声明值得进一步调查。这将根据您的项目的Group
属性对您的项目集合进行分组。将项目分组后,然后创建Group
该类的新实例。传入组的名称属性(这是键),并将子项设置为组本身,然后 ta-da!
最后,这是 的 XAML Window
,它使用HierarchicalDataTemplate
:
<Window x:Class="TestWpfApplication.DistinctLeaves"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DistinctLeaves" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<TreeView ItemsSource="{Binding Groups}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
结果如下:
替代文字 http://img339.imageshack.us/img339/8555/distinctleaves.jpg