WPF:是否有内置的TreeGrid / TreeListView?

时间:2010-04-24 04:18:08

标签: wpf controls treelistview

我需要这样的东西:

alt text

(我需要TreeView和ListView方面。也就是说,Hirearchy和Columns。)

但是,我需要它在WPF中。这是内置的东西,还是我必须自己构建它?

我认为它必须在框架中的某个地方,因为VS2010是在WPF中构建的。

编辑: 我已经设法使用TreeView获得了一些我想要的功能,并且一些网格的Columns绑定到Parent网格的列,但功能中有太多的怪癖。

编辑2: 我仍然没有找到办法做到这一点。有什么想法吗?

7 个答案:

答案 0 :(得分:10)

MSDN上的这篇文章利用原生WPF来实现TreeView / Grid混合。它基于TreeView和Grid控件。它支持具有多个列的树视图,但不支持排序或过滤

http://dlaa.me/blog/post/9898803

编辑:我最近整合了这段代码并且效果非常好,可以提供您想要的内容:http://www.codeproject.com/Articles/30721/WPF-TreeListView-Control

答案 1 :(得分:5)

您是否考虑过 Xceed.Wpf.DataGrid

您可以看到完整版 here的演示。

还有一个社区版本作为Extended WPF Toolkit™的一部分 - Ms-PL license

List of the features in Full version
List of the features in Community Edition
不幸的是,我找不到表格式的汇编。

P.S。

  1. 在Visual Studio 2010(专业版)上使用 Snoop (WPF Spy实用程序)和 Spy ++ ,我发现<您在 Watch Local Autos 工具窗口中看到的em> TreeGrid 被称为 TREEGRID 一个Wpf组件。 (但我不确定它是什么) 有趣的是,我发现 Breakpoints 工具窗口是通过并排使用两个组件构建的 - SysTreeView32 SysListView32 < / p>

  2. 我与Xceed没有任何关系: - )

  3. 编辑:
    似乎可以在两个版本上实现层次结构,但完整版仅存在完整版,而社区版只能使用群组 : - (

答案 2 :(得分:1)

您可以使用TreeView中模板中特殊对齐的共享Grid对象伪造此显示...

但是,我不相信您在Visual Studio中看到的那个实际上是WPF控件实现,它也存在于Visual Studio 2008中,可能是自定义本机控件或自定义Windows窗体控件。

好消息:如果你必须绝对拥有这种体验并且很快就想要它......这完全是黑客攻击,但是:使用Windows Forms与你的WPF应用程序互操作。

微软员工在'06中发布了一个winforms TreeGridView实现:

答案 3 :(得分:0)

这个作品对我来说就像一种魅力。 https://www.codeproject.com/Articles/30721/WPF-TreeListView-Control

  • 您可以使用GetChildren和HasChildren实现ITreeModel。最好与注册表示例一起检查示例代码,以了解其操作方式。由于某种原因,开发人员忘记添加简单的示例...
  • 您必须自己向控件中添加依赖项属性才能使其与MVVM一起使用。因此,可能需要进行一些调整。将此添加到TreeList.cs以能够绑定TreeModel:

public ITreeModel TreeModel
{
    get => (ITreeModel)GetValue(TreeModelProperty);
    set => SetValue(TreeModelProperty, value);
}

public static readonly DependencyProperty TreeModelProperty =
    DependencyProperty.Register(
        "TreeModel",
        typeof(ITreeModel), 
        typeof(TreeList), 
        new PropertyMetadata(null, OnModelChanged));

private static void OnModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var treeList = (TreeList) d;
    treeList.Root.Children.Clear();
    treeList.Rows.Clear();
    treeList.CreateChildrenNodes(treeList.Root);
}

答案 4 :(得分:-1)

您正在寻找TreeView http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview.aspx

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Page.Resources>
        <XmlDataProvider x:Key="StaticXml" XPath="root/foo">
            <x:XData>
                <root xmlns="">
                    <foo a="_File">
                        <foo a="New">
                            <foo a="_Project..." />
                            <foo a="_Web Site..."/>
                        </foo>
                        <foo a="C_lose"/>
                        <foo a="E_xit"/>
                    </foo>
                    <foo a="_Edit">
                        <foo a="Cu_t"/>
                        <foo a="_Copy"/>
                        <foo a="_Paste"/>
                    </foo>
                </root>
            </x:XData>
        </XmlDataProvider>
        <HierarchicalDataTemplate x:Key="MenuTemplate" ItemsSource="{Binding XPath=foo}">
            <AccessText Text="{Binding XPath=@a}"/>
        </HierarchicalDataTemplate>
    </Page.Resources>
    <StackPanel>
        <TreeView
                ItemsSource="{Binding Source={StaticResource StaticXml}}"
              ItemTemplate="{StaticResource MenuTemplate}"/>
    </StackPanel>
</Page>

答案 5 :(得分:-1)

ObjectListView对我来说似乎很好......

答案 6 :(得分:-1)

通过跟随this tutorial(借助ViewModel 部分滚动假组合),您可以在某种程度上通过DataGrid获取此行为。

该教程的解决方案运行良好,但滚动可能会变得迟钝,并且当某些行被折叠时,它的行为是不可预测的。

更新:我改变了隐藏孩子的方式。我没有折叠行,而是删除了绑定的ObservableCollection中的项目。滚动效果非常好!