Reputation: 49544
I need something just like this:
(I need both the TreeView and the ListView aspects. That is, Hirearchy and Columns.)
But, I need it in WPF. is this something that is built in, or am I going to have to build it myself?
I assume it has to be somewhere in the framework, since VS2010 is build in WPF.
Edit: I have managed to get some of the functionality that I want using a TreeView and some grids with their Columns bound to a Parent grid's columns, but there are too many quirks in the functionality.
Edit 2: I still have as-of-yet not found a way to do this. Any ideas?
Upvotes: 31
Views: 37054
Reputation: 6385
You may be able to fake this display using specially-aligned shared Grid objects in your templates for TreeView...
However I don't believe the one you see in Visual Studio is actually a WPF control implementation, it was there in Visual Studio 2008 as well and is likely either a custom native control or custom Windows Forms control.
Good news, though: if you must absolutely have this experience and want it soon... it's a total hack, but: use Windows Forms interop with your WPF app.
A Microsoft employee blogged a winforms TreeGridView
implementation back in '06:
Upvotes: 0
Reputation: 3093
This one works like a charm for me. https://www.codeproject.com/Articles/30721/WPF-TreeListView-Control
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);
}
Upvotes: 0
Reputation: 2210
You can somewhat obtain this behavior with the DataGrid by following this tutorial (scroll the the Fake grouping with the help of the ViewModel section).
The tutorial's solution works well enough, but scrolling can get laggy and it's behavior unpredictable when some rows are collapsed.
Update: I changed how the children are hidden. Instead of collapsing rows, I removed items in the bound ObservableCollection. Now scrolling works perfectly!
Upvotes: -1
Reputation: 5617
This post on MSDN makes use of native WPF to achieve a TreeView/Grid hybrid. It is based on the TreeView and Grid controls. It supports a treeview with multiple columns, but does not support sorting or filtering
http://dlaa.me/blog/post/9898803
EDIT: I have recently integrated this code and it works very nicely, gives you exactly what you want: http://www.codeproject.com/Articles/30721/WPF-TreeListView-Control
Upvotes: 13
Reputation: 4800
Have you considered Xceed.Wpf.DataGrid ?
You can see a Demo of Full Version here.
There's also a Community Edition as part of Extended WPF Toolkit™ - Ms-PL license
List of the features in Full version
List of the features in Community Edition
Unfortunately, I couldn't find a table-styled compilation.
P.S.
By using Snoop (WPF Spy utility) and Spy++ on Visual Studio 2010 (Professional edition), I've found that the TreeGrid you see inside Watch, Local, and Autos tool-windows, is called TREEGRID which is not a Wpf component. (But I'm not sure what it is).
Interesting though, I've found that the Breakpoints tool-window was built by using two components side-by-side - SysTreeView32 and SysListView32
I'm not related to Xceed in any way :-)
Edit:
It seems that Hierarchy can be achieved on both Version, but Master-Detail is only present in the Full version, and on the Community version you can get only by using Groups.
:-(
Upvotes: 6
Reputation: 5348
You are looking for the 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>
Upvotes: -2