wpf-devexpress-dot-xpf-dot-grid-dot-treeviewcontrol-4aa68877.md
Gets or sets the tree derivation mode. This is a dependency property.
Namespace : DevExpress.Xpf.Grid
Assembly : DevExpress.Xpf.Grid.v25.2.dll
NuGet Package : DevExpress.Wpf.Grid.Core
public TreeDerivationMode TreeDerivationMode { get; set; }
Public Property TreeDerivationMode As TreeDerivationMode
| Type | Default | Description |
|---|---|---|
| TreeDerivationMode | ChildNodesSelector |
The tree derivation mode.
|
Available values:
| Name | Description |
|---|---|
| Selfreference |
Builds a tree from a self-referential data structure. To learn more, see Bind to Self-Referential Data Structure.
| | ChildNodesSelector |
You should manually write code to specify where a data object’s child items come from by creating a selector class. To learn more, see Bind to Hierarchical Data Structure.
| | HierarchicalDataTemplate |
Builds a tree using Hierarchical Data Templates. To learn more, see Hierarchical Data Templates.
|
The TreeViewControl can display information in a tree from a self-referential (flat) or hierarchical data structure. The TreeDerivationMode property specifies the corresponding tree derivation modes for each data structure:
|
Data Structure Type
|
Tree Derivation Mode
| | --- | --- | |
Self-Referential (Flat)
|
Self-Reference
| |
Hierarchical
|
Child Nodes Selector
Child Nodes Path
Hierarchical Data Template
|
The Child Nodes Selector returns node children. You can use the returned list of child nodes to create a hierarchical data structure for different object types.
Use the Child Nodes Selector to create a hierarchical data structure in the TreeViewControl. An example of this structure is shown below:
public class ProjectObject : BaseObject {
public ObservableCollection<ProjectStage> Stages { get; set; }
}
public class ProjectStage : BaseObject {
public ObservableCollection<Task> Tasks { get; set; }
}
public class Task : BaseObject {
State state;
// ...
}
Public Class ProjectObject
Inherits BaseObject
Public Property Stages As ObservableCollection(Of ProjectStage)
End Class
Public Class ProjectStage
Inherits BaseObject
Public Property Tasks As ObservableCollection(Of Task)
End Class
Public Class Task
Inherits BaseObject
Private state As State
' ...
End Class
Create a selector class that implements IChildNodesSelector, and override the SelectChildren(Object) method that returns node children.
Assign the Child Nodes Selector to the ChildNodesSelector property.
Use the Child Nodes Path to bind the TreeViewControl to a collection if all objects have the same field that contains child nodes.
In this mode, you can use the HasChildNodesPath property to control whether a node has children.
To build a tree structure, set the ChildNodesPath property to a field that contains child nodes (the Employees field in the code sample below).
<dxg:TreeViewControl ItemsSource="{Binding EmployeeDepartments}"
ChildNodesPath="Employees"
TreeViewFieldName="Name"
HasChildNodesPath="HasChildNodes"/>
using System.Windows;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using DevExpress.Mvvm;
namespace TreeViewChildNodesSelector {
public class MainWindowViewModel : ViewModelBase {
public MainWindowViewModel() {
EmployeeDepartments = Departments.GetDepartments();
}
public List<EmployeeDepartment> EmployeeDepartments { get; set; }
}
public class Employee {
public Employee(int id, string name) {
ID = id;
Name = name;
}
public int ID { get; set; }
public string Name { get; set; }
}
public class EmployeeDepartment {
public string Name { get; set; }
public ObservableCollection<Employee> Employees { get; }
public bool HasChildNodes { get; set; }
public EmployeeDepartment(string name, IEnumerable<Employee> employees) {
Name = name;
Employees = new ObservableCollection<Employee>(employees);
}
}
public static class Departments {
public static List<EmployeeDepartment> GetDepartments() {
List<EmployeeDepartment> departments = new List<EmployeeDepartment> {
new EmployeeDepartment("Management", new Employee[] {
new Employee(0, "Gregory S. Price")
}, true),
new EmployeeDepartment("Marketing", new Employee[] {
new Employee(1, "Irma R. Marshall"),
new Employee(2, "Brian C. Cowling"),
new Employee(3, "Thomas C. Dawson"),
new Employee(4, "Bryan R. Henderson"),
}, true),
new EmployeeDepartment("Operations", new Employee[] {
new Employee(5, "John C. Powell"),
new Employee(6, "Harold S. Brandes"),
new Employee(7, "Jan K. Sisk"),
new Employee(8, "Sidney L. Holder"),
}, true),
new EmployeeDepartment("Production", new Employee[] {
new Employee(9, "Christian P. Laclair"),
new Employee(10, "James L. Kelsey"),
new Employee(11, "Howard M. Carpenter"),
new Employee(12, "Jennifer T. Tapia"),
},false),
new EmployeeDepartment("Finance", new Employee[] {
new Employee(13, "Karen J. Kelly"),
new Employee(14, "Judith P. Underhill"),
new Employee(15, "Russell E. Belton"),
},false)
};
return departments;
}
}
}
Imports System.Windows
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports DevExpress.Mvvm
Namespace TreeViewChildNodesSelector
Public Class MainWindowViewModel
Inherits ViewModelBase
Public Sub New()
EmployeeDepartments = Departments.GetDepartments()
End Sub
Public Property EmployeeDepartments As List(Of EmployeeDepartment)
End Class
Public Class Employee
Public Sub New(ByVal id As Integer, ByVal name As String)
ID = id
Name = name
End Sub
Public Property ID As Integer
Public Property Name As String
End Class
Public Class EmployeeDepartment
Public Property Name As String
Public ReadOnly Property Employees As ObservableCollection(Of Employee)
Public Property HasChildNodes As Boolean
Public Sub New(ByVal name As String, ByVal employees As IEnumerable(Of Employee))
Name = name
Employees = New ObservableCollection(Of Employee)(employees)
End Sub
End Class
Module Departments
Function GetDepartments() As List(Of EmployeeDepartment)
Dim departments As List(Of EmployeeDepartment) = New List(Of EmployeeDepartment) From {
New EmployeeDepartment("Management", New Employee() {New Employee(0, "Gregory S. Price")}, True),
New EmployeeDepartment("Marketing", New Employee() {New Employee(1, "Irma R. Marshall"), New Employee(2, "Brian C. Cowling"), New Employee(3, "Thomas C. Dawson"), New Employee(4, "Bryan R. Henderson")}, True),
New EmployeeDepartment("Operations", New Employee() {New Employee(5, "John C. Powell"), New Employee(6, "Harold S. Brandes"), New Employee(7, "Jan K. Sisk"), New Employee(8, "Sidney L. Holder")}, True),
New EmployeeDepartment("Production", New Employee() {New Employee(9, "Christian P. Laclair"), New Employee(10, "James L. Kelsey"), New Employee(11, "Howard M. Carpenter"), New Employee(12, "Jennifer T. Tapia")}, False),
New EmployeeDepartment("Finance", New Employee() {New Employee(13, "Karen J. Kelly"), New Employee(14, "Judith P. Underhill"), New Employee(15, "Russell E. Belton")}, False)
}
Return departments
End Function
End Module
End Namespace
Set the TreeDerivationMode property to Selfreference to enable the self-referential mode.
To build a tree structure, your data source should contain the following two fields with the same data type:
In this mode, you can specify the RootValue property to add to the collection of root nodes only nodes with the specified parent field value.
<dxg:TreeViewControl ItemsSource="{Binding Employees}"
TreeDerivationMode="Selfreference"
KeyFieldName="ID"
ParentFieldName="ParentID"
TreeViewFieldName="Name">
<dxg:TreeViewControl.RootValue>
<sys:Int32>1</sys:Int32>
</dxg:TreeViewControl.RootValue>
</dxg:TreeViewControl>
using System.Windows;
using System.Collections.Generic;
using DevExpress.Mvvm;
namespace TreeViewSelfreference {
public class Employee : BindableBase {
public int ID { get; set; }
public int ParentID { get; set; }
public string Name { get; set; }
public string Position { get; set; }
public string Department { get; set; }
}
public static class Staff {
public static List<Employee> GetStaff() {
List<Employee> staff = new List<Employee> {
new Employee() { ID = 1, ParentID = 0, Name = "Gregory S. Price", Department = "", Position = "President" },
new Employee() { ID = 2, ParentID = 1, Name = "Irma R. Marshall", Department = "Marketing", Position = "Vice President" },
new Employee() { ID = 3, ParentID = 1, Name = "John C. Powell", Department = "Operations", Position = "Vice President" },
new Employee() { ID = 4, ParentID = 1, Name = "Christian P. Laclair", Department = "Production", Position = "Vice President" },
new Employee() { ID = 5, ParentID = 1, Name = "Karen J. Kelly", Department = "Finance", Position = "Vice President" },
new Employee() { ID = 6, ParentID = 2, Name = "Brian C. Cowling", Department = "Marketing", Position = "Manager" },
new Employee() { ID = 7, ParentID = 2, Name = "Thomas C. Dawson", Department = "Marketing", Position = "Manager" },
new Employee() { ID = 8, ParentID = 2, Name = "Angel M. Wilson", Department = "Marketing", Position = "Manager" },
new Employee() { ID = 9, ParentID = 2, Name = "Bryan R. Henderson", Department = "Marketing", Position = "Manager" },
new Employee() { ID = 10, ParentID = 3, Name = "Harold S. Brandes", Department = "Operations", Position = "Manager" },
new Employee() { ID = 11, ParentID = 3, Name = "Michael S. Blevins", Department = "Operations", Position = "Manager" },
new Employee() { ID = 12, ParentID = 3, Name = "Jan K. Sisk", Department = "Operations", Position = "Manager" },
new Employee() { ID = 13, ParentID = 3, Name = "Sidney L. Holder", Department = "Operations", Position = "Manager" },
new Employee() { ID = 14, ParentID = 4, Name = "James L. Kelsey", Department = "Production", Position = "Manager" },
new Employee() { ID = 15, ParentID = 4, Name = "Howard M. Carpenter", Department = "Production", Position = "Manager" },
new Employee() { ID = 16, ParentID = 4, Name = "Jennifer T. Tapia", Department = "Production", Position = "Manager" },
new Employee() { ID = 17, ParentID = 5, Name = "Judith P. Underhill", Department = "Finance", Position = "Manager" },
new Employee() { ID = 18, ParentID = 5, Name = "Russell E. Belton", Department = "Finance", Position = "Manager" }
};
return staff;
}
}
public class MainWindowViewModel : ViewModelBase {
public MainWindowViewModel() {
Employees = Staff.GetStaff();
}
public List<Employee> Employees { get; private set; }
}
}
Imports System.Windows
Imports System.Collections.Generic
Imports DevExpress.Mvvm
Namespace TreeViewSelfreference
Public Class Employee
Inherits BindableBase
Public Property ID As Integer
Public Property ParentID As Integer
Public Property Name As String
Public Property Position As String
Public Property Department As String
End Class
Module Staff
Function GetStaff() As List(Of Employee)
Dim staff As List(Of Employee) = New List(Of Employee) From {
New Employee() With { .ID = 1, .ParentID = 0, .Name = "Gregory S. Price", .Department = "", .Position = "President" },
New Employee() With { .ID = 2, .ParentID = 1, .Name = "Irma R. Marshall", .Department = "Marketing", .Position = "Vice President" },
New Employee() With { .ID = 3, .ParentID = 1, .Name = "John C. Powell", .Department = "Operations", .Position = "Vice President" },
New Employee() With { .ID = 4, .ParentID = 1, .Name = "Christian P. Laclair", .Department = "Production", .Position = "Vice President" },
New Employee() With { .ID = 5, .ParentID = 1, .Name = "Karen J. Kelly", .Department = "Finance", .Position = "Vice President" },
New Employee() With { .ID = 6, .ParentID = 2, .Name = "Brian C. Cowling", .Department = "Marketing", .Position = "Manager" },
New Employee() With { .ID = 7, .ParentID = 2, .Name = "Thomas C. Dawson", .Department = "Marketing", .Position = "Manager" },
New Employee() With { .ID = 8, .ParentID = 2, .Name = "Angel M. Wilson", .Department = "Marketing", .Position = "Manager" },
New Employee() With { .ID = 9, .ParentID = 2, .Name = "Bryan R. Henderson", .Department = "Marketing", .Position = "Manager" },
New Employee() With { .ID = 10, .ParentID = 3, .Name = "Harold S. Brandes", .Department = "Operations", .Position = "Manager" },
New Employee() With { .ID = 11, .ParentID = 3, .Name = "Michael S. Blevins", .Department = "Operations", .Position = "Manager" },
New Employee() With { .ID = 12, .ParentID = 3, .Name = "Jan K. Sisk", .Department = "Operations", .Position = "Manager" },
New Employee() With { .ID = 13, .ParentID = 3, .Name = "Sidney L. Holder", .Department = "Operations", .Position = "Manager" },
New Employee() With { .ID = 14, .ParentID = 4, .Name = "James L. Kelsey", .Department = "Production", .Position = "Manager" },
New Employee() With { .ID = 15, .ParentID = 4, .Name = "Howard M. Carpenter", .Department = "Production", .Position = "Manager" },
New Employee() With { .ID = 16, .ParentID = 4, .Name = "Jennifer T. Tapia", .Department = "Production", .Position = "Manager" },
New Employee() With { .ID = 17, .ParentID = 5, .Name = "Judith P. Underhill", .Department = "Finance", .Position = "Manager" },
New Employee() With { .ID = 18, .ParentID = 5, .Name = "Russell E. Belton", .Department = "Finance", .Position = "Manager" }
}
Return staff
End Function
End Module
Public Class MainWindowViewModel
Inherits ViewModelBase
Public Sub New()
Employees = Staff.GetStaff()
End Sub
Public Property Employees As List(Of Employee)
End Class
End Namespace
You can use templates to create a hierarchical data structure in the TreeViewControl. An example of this structure is shown below:
public class ProjectObject : BaseObject {
public ObservableCollection<ProjectStage> Stages { get; set; }
}
public class ProjectStage : BaseObject {
public ObservableCollection<Task> Tasks { get; set; }
}
public class Task : BaseObject {
State state;
// ...
}
Public Class ProjectObject
Inherits BaseObject
Public Property Stages As ObservableCollection(Of ProjectStage)
End Class
Public Class ProjectStage
Inherits BaseObject
Public Property Tasks As ObservableCollection(Of Task)
End Class
Public Class Task
Inherits BaseObject
Private state As State
' ...
End Class
If all objects have the same field that contains child nodes, create a hierarchical data template and assign it to the NodeTemplate property. You can put hierarchical data templates into resources. Specify the data type to which a template should be applied:
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:ProjectObject}" ItemsSource="{Binding Path=Stages}" />
<HierarchicalDataTemplate DataType="{x:Type local:ProjectStage}" ItemsSource="{Binding Path=Tasks}" />
</Window.Resources>
<dxg:TreeViewControl ItemsSource="{Binding DataItems}"
TreeViewFieldName="Name"
TreeDerivationMode="HierarchicalDataTemplate"/>
If all objects have different fields that contain child nodes:
Create a template selector that implements the System.Windows.Controls.DataTemplateSelector and overrides the SelectTemplate method.
Assign the template selector to the NodeTemplateSelector property.
Set the TreeDerivationMode property to HierarchicalDataTemplate.
Refer to the following help topic for more information: Hierarchical Data Structure.
See Also