0

我有一组结构如下的数据:

 ItemA.GroupA
 ItemB.GroupA
 ItemC.GroupB
 ItemD.GroupC

我需要像这样在 WPF 树视图中显示数据:

A组

--- 项目A

--- 项目B

B组

--- 项目 C

C组

--- 项目 D

我可以使用什么 XAML 按不同的值对叶子进行分组?例如,集合中可能有多个项目,它们是 GroupA.ItemA,但是,我只想呈现节点和叶子一次。

4

2 回答 2

1

您将无法在 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 则需要手动测试。

于 2010-04-12T21:16:56.700 回答
1

我不同意这里的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

于 2010-04-12T22:27:28.130 回答