Back to Devexpress

Self-Referential Data Structure

wpf-402346-controls-and-libraries-navigation-controls-treeview-data-binding-options-self-referential-data-structure.md

latest7.9 KB
Original Source

Self-Referential Data Structure

  • Oct 28, 2020
  • 6 minutes to read

To display a tree structure, your data source should contain the following two fields with the same data type:

  • Key Field - This field should contain unique values used to identify nodes. Assign its name to the KeyFieldName property.
  • Parent Field - This field should contain values that indicate parent nodes. Assign its name to the ParentFieldName property.

Set the TreeViewControl.TreeDerivationMode property to Selfreference to enable the self-referential mode.

xaml
<dx:ThemedWindow ... >
    <dx:ThemedWindow.DataContext>
        <local:MainWindowViewModel/>
    </dx:ThemedWindow.DataContext>
    <Grid>        
        <dxg:TreeViewControl ItemsSource="{Binding Employees}" 
                             TreeDerivationMode="Selfreference" 
                             KeyFieldName="ID" 
                             ParentFieldName="ParentID" 
                             TreeViewFieldName="Name">            
        </dxg:TreeViewControl>
    </Grid>
</dx:ThemedWindow>
csharp
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; }
    }
}
vb
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