This guide explains how DockControl uses DataTemplates to render different dock elements and how to create custom dock types with their own visual representation.
The Dock library uses Avalonia’s DataTemplate system to render different types of dock elements. Each dock type (documents, tools, containers, splitters) has a corresponding DataTemplate that defines how it should be visually represented.
DockControl automatically creates DataTemplates for all dock types when its template is applied. The process works as follows:
AutoCreateDataTemplates
is true
(default), DockControl automatically adds DataTemplates for all built-in dock typesYou can control DataTemplate behavior using the AutoCreateDataTemplates
property:
// Disable automatic creation to use custom templates
dockControl.AutoCreateDataTemplates = false;
// Or in XAML
<DockControl AutoCreateDataTemplates="False" />
The RequiresDataTemplateAttribute
marks dock interfaces that need DataTemplates. This ensures all dock types have proper visual representation.
When creating custom dock types, mark the interface with this attribute:
[RequiresDataTemplate]
public interface IMyCustomDock : IDock
{
// Interface members
}
This attribute serves two purposes:
The library provides DataTemplates for all built-in dock types:
Content Types:
IDocumentContent
→ DocumentContentControl
IToolContent
→ ToolContentControl
Container Types:
IDocumentDock
→ DocumentDockControl
IToolDock
→ ToolDockControl
IProportionalDock
→ ProportionalDockControl
IStackDock
→ StackDockControl
IGridDock
→ GridDockControl
IWrapDock
→ WrapDockControl
IUniformGridDock
→ UniformGridDockControl
IDockDock
→ DockDockControl
IRootDock
→ RootDockControl
Splitter Types:
IProportionalDockSplitter
→ ProportionalStackPanelSplitter
IGridDockSplitter
→ GridSplitter
All DataTemplates are created automatically by DockDataTemplateHelper
using Avalonia’s binding syntax.
To create a custom dock type with its own visual representation:
Create your custom dock interface and mark it with the attribute:
[RequiresDataTemplate]
public interface ICustomTabDock : IDock
{
string TabStyle { get; set; }
bool ShowTabIcons { get; set; }
}
Create a concrete implementation using your preferred model (Avalonia, MVVM, ReactiveUI, etc.):
public class CustomTabDock : Dock, ICustomTabDock
{
public string TabStyle { get; set; } = "Default";
public bool ShowTabIcons { get; set; } = true;
}
Design the visual control for your dock type:
public class CustomTabDockControl : TemplatedControl
{
// Implement your custom control logic
}
Option A: In Code (Recommended)
// Add your custom template alongside the default ones
var customTemplate = new FuncDataTemplate<ICustomTabDock>(
(data, scope) => new CustomTabDockControl { DataContext = data });
dockControl.DataTemplates.Add(customTemplate);
// Default templates are automatically added if AutoCreateDataTemplates is true (default)
// To disable default templates entirely, set AutoCreateDataTemplates = false
Option B: In XAML
<DockControl>
<DockControl.DataTemplates>
<!-- Your custom template is added alongside the default ones -->
<DataTemplate DataType="{x:Type model:ICustomTabDock}">
<controls:CustomTabDockControl />
</DataTemplate>
</DockControl.DataTemplates>
</DockControl>
When working with custom dock types and DataTemplates:
[RequiresDataTemplate]
IMyDock
, MyDock
, MyDockControl
!
) for property bindings when creating templates programmaticallyAutoCreateDataTemplates
when you want to provide all templates manually