具有TreeView类型层次结构的WPF DataGrid

时间:2011-10-12 11:13:29

标签: wpf wpfdatagrid hierarchical-data

是否可以拥有纯粹的分层wpf数据网格?现在有3种可能的解决方案在互联网上讨论......

  1. GroupStyle
  2. TreeListView而不是DataGrid
  3. RowDetailsTemplate
  4. 现在所有3个都没有用,因为它们都有局限性。

    GroupStyle提供了分组的行演示者,但其父级只是GroupItem。这是我的数据源不同的地方。在我的情况下,分组项目的父项将是相同类型的项目。

    e.g。 Folder班级有List<Folders> children。因此子文件夹的父级本身是Folder类型。

    RowDetailsTemplate需要我托管另一个绑定到Children的数据网格,但这意味着它会有自己的列标题,而我想要的是分享的子项strong>父DataGrid的相同列视图,就像它们在TreeListView中一样。

    对于TreeListView,这就是我现在正在使用的,但它的问题是......

    它失去了虚拟化,它不是数据网格

    : - )

    我正在考虑一些附加行为,切换数据网格的层次结构视图,如...

      <DataGrid HierarchicalBehavior.HierarchyPath="Children" ... />
    

    其中Children是每个项目下IEnumerable类型的属性。

    我希望你们明白我的目标。

    有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我终于可以实现这个了。代码太大,无法发布。但如果有人在寻找解决方案,请发送电子邮件给我。

基本上我做了以下事情......

  1. 我将项目层次结构的快速扁平化用于平面列表。
  2. 绑定到WPF数据网格的每个项目我实现了INotifyPropertyChanged,并通过基类跟踪了额外的属性..
  3. 家长 =&gt;这个项目是儿童的父项目。只读的。

    HasHierarchy =&gt;层次结构子项为null或为空时为False。可写的。

    IsItemVisible =&gt;目前的可见度。可写的。

    IsBranchVisible =&gt;如果任何祖先具有IsExpanded = false或IsItemVisible = false,则返回false。 ReadOnly但可通知。

    IsExpanded =&gt;如果项目已展开。可写的。

    3. I put a PLINQ call to filter the `IsBranchVisible` property as true, of all children whenever any descenden's `IsExpanded` property is **toggled**.
    

    Voala!它就像魅力一样。由于PLINQ而快速。