diff --git a/samples/SampleApp/DemoPages/TreeDataGridDemo.axaml b/samples/SampleApp/DemoPages/TreeDataGridDemo.axaml
new file mode 100644
index 0000000..5dd9b70
--- /dev/null
+++ b/samples/SampleApp/DemoPages/TreeDataGridDemo.axaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/SampleApp/DemoPages/TreeDataGridDemo.axaml.cs b/samples/SampleApp/DemoPages/TreeDataGridDemo.axaml.cs
new file mode 100644
index 0000000..7fcc187
--- /dev/null
+++ b/samples/SampleApp/DemoPages/TreeDataGridDemo.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace SampleApp.DemoPages;
+
+public partial class TreeDataGridDemo : UserControl
+{
+ public TreeDataGridDemo()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/samples/SampleApp/MainWindow.axaml b/samples/SampleApp/MainWindow.axaml
index 98a4c20..8c2ce37 100644
--- a/samples/SampleApp/MainWindow.axaml
+++ b/samples/SampleApp/MainWindow.axaml
@@ -68,6 +68,13 @@
+
+
+
+
+
+
+
diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj
index 2f1d9c5..a41e2d8 100644
--- a/samples/SampleApp/SampleApp.csproj
+++ b/samples/SampleApp/SampleApp.csproj
@@ -16,6 +16,7 @@
+
diff --git a/samples/SampleApp/ViewModels/TreeDataGridViewModel.cs b/samples/SampleApp/ViewModels/TreeDataGridViewModel.cs
new file mode 100644
index 0000000..b6c2888
--- /dev/null
+++ b/samples/SampleApp/ViewModels/TreeDataGridViewModel.cs
@@ -0,0 +1,68 @@
+using System.Collections.ObjectModel;
+using Avalonia.Controls;
+using Avalonia.Controls.Models.TreeDataGrid;
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace SampleApp.ViewModels;
+
+public class Person
+{
+ public string? FirstName { get; set; }
+ public string? LastName { get; set; }
+ public int Age { get; set; }
+ public ObservableCollection Children { get; } = new();
+}
+
+public class TreeDataGridViewModel : ObservableObject
+{
+ private readonly ObservableCollection _people = new()
+ {
+ new Person
+ {
+ FirstName = "Eleanor",
+ LastName = "Pope",
+ Age = 32,
+ Children =
+ {
+ new Person { FirstName = "Marcel", LastName = "Gutierrez", Age = 4 }
+ }
+ },
+ new Person
+ {
+ FirstName = "Jeremy",
+ LastName = "Navarro",
+ Age = 74,
+ Children =
+ {
+ new Person
+ {
+ FirstName = "Jane",
+ LastName = "Navarro",
+ Age = 42,
+ Children =
+ {
+ new Person { FirstName = "Lailah ", LastName = "Velazquez", Age = 16 }
+ }
+ }
+ }
+ },
+ new Person { FirstName = "Jazmine", LastName = "Schroeder", Age = 52 }
+ };
+
+ public TreeDataGridViewModel()
+ {
+ Source = new HierarchicalTreeDataGridSource(_people)
+ {
+ Columns =
+ {
+ new HierarchicalExpanderColumn(
+ new TextColumn("First Name", x => x.FirstName),
+ x => x.Children),
+ new TextColumn("Last Name", x => x.LastName),
+ new TextColumn("Age", x => x.Age)
+ }
+ };
+ }
+
+ public HierarchicalTreeDataGridSource Source { get; }
+}
\ No newline at end of file
diff --git a/src/Devolutions.AvaloniaTheme.DevExpress/Accents/Styles.axaml b/src/Devolutions.AvaloniaTheme.DevExpress/Accents/Styles.axaml
index 632f054..06bff48 100644
--- a/src/Devolutions.AvaloniaTheme.DevExpress/Accents/Styles.axaml
+++ b/src/Devolutions.AvaloniaTheme.DevExpress/Accents/Styles.axaml
@@ -38,4 +38,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/Devolutions.AvaloniaTheme.DevExpress/Controls/TreeDataGrid.axaml b/src/Devolutions.AvaloniaTheme.DevExpress/Controls/TreeDataGrid.axaml
new file mode 100644
index 0000000..55021f7
--- /dev/null
+++ b/src/Devolutions.AvaloniaTheme.DevExpress/Controls/TreeDataGrid.axaml
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ M1875 1011l-787 787v-1798h-128v1798l-787 -787l-90 90l941 941l941 -941z
+ M1965 947l-941 -941l-941 941l90 90l787 -787v1798h128v-1798l787 787z
+ M 1,0 10,10 l -9,10 -1,-1 L 8,10 -0,1 Z
+ M0,1 L10,10 20,1 19,0 10,8 1,0 Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Devolutions.AvaloniaTheme.DevExpress/Controls/_index.axaml b/src/Devolutions.AvaloniaTheme.DevExpress/Controls/_index.axaml
index 39427cf..fa77ae3 100644
--- a/src/Devolutions.AvaloniaTheme.DevExpress/Controls/_index.axaml
+++ b/src/Devolutions.AvaloniaTheme.DevExpress/Controls/_index.axaml
@@ -18,6 +18,7 @@
+
diff --git a/src/Devolutions.AvaloniaTheme.DevExpress/Devolutions.AvaloniaTheme.DevExpress.csproj b/src/Devolutions.AvaloniaTheme.DevExpress/Devolutions.AvaloniaTheme.DevExpress.csproj
index c2f60d8..9d0292a 100644
--- a/src/Devolutions.AvaloniaTheme.DevExpress/Devolutions.AvaloniaTheme.DevExpress.csproj
+++ b/src/Devolutions.AvaloniaTheme.DevExpress/Devolutions.AvaloniaTheme.DevExpress.csproj
@@ -15,6 +15,7 @@
+
diff --git a/src/Devolutions.AvaloniaTheme.Linux/Devolutions.AvaloniaTheme.Linux.csproj b/src/Devolutions.AvaloniaTheme.Linux/Devolutions.AvaloniaTheme.Linux.csproj
index 2b61abd..b4b32c8 100644
--- a/src/Devolutions.AvaloniaTheme.Linux/Devolutions.AvaloniaTheme.Linux.csproj
+++ b/src/Devolutions.AvaloniaTheme.Linux/Devolutions.AvaloniaTheme.Linux.csproj
@@ -15,6 +15,7 @@
+