npx skills add ...
npx skills add syncfusion/wpf-ui-components-skills --skill syncfusion-wpf-kanban-board
Implement Syncfusion WPF Kanban (SfKanban) control for workflow visualization and task management. Use this when building agile project tracking interfaces, workflow boards, or task management systems. This skill covers card configuration, column management, swim lanes, WIP limits, drag-and-drop functionality, workflows, sorting, and event handling.
npx skills add syncfusion/wpf-ui-components-skills --skill syncfusion-wpf-kanban-board
This skill provides comprehensive guidance for implementing the Syncfusion® WPF Kanban (SfKanban) control, a powerful visual workflow management system that displays tasks as cards organized across columns representing different workflow stages.
Use this skill immediately when:
The Syncfusion WPF Kanban (SfKanban) provides an efficient way to visualize workflows at each stage of completion. It offers:
Core Features:
📄 Read: references/getting-started.md
Use when user needs:
📄 Read: references/cards.md
Use when user needs:
📄 Read: references/columns.md
Use when user needs:
📄 Read: references/swimlanes.md
Use when user needs:
📄 Read: references/workflows.md
Use when user needs:
📄 Read: references/sorting.md
Use when user needs:
📄 Read: references/events.md
Use when user needs:
When: User wants quick setup with columns generated from data
Result: Columns created automatically based on unique Category values in data
When: User needs to limit tasks per stage and show visual feedback
Result:
When: User needs custom card appearance beyond default
DataContext: KanbanModel instance
When: User wants to organize cards by teams or projects
Result: Horizontal swim lane rows, one per unique Assignee value
When: User wants to enforce specific card transition rules
Result:
When: User has existing data model, not using KanbanModel
Important: Must define CardTemplate when using custom model
| Property | Type | Purpose | When to Use |
|---|---|---|---|
ItemsSource | object | Data source for cards | Always (required) |
AutoGenerateColumns | bool | Auto-create columns from Category | Quick setup vs custom control |
Columns | Collection | Manual column definitions | When AutoGenerateColumns = false |
ColumnMappingPath | string | Property for column categorization | Custom models (default: "Category") |
SwimlaneKey | string | Property for swim lane grouping | Organizing by teams/projects |
CardTemplate | DataTemplate | Custom card appearance | Custom data models or styling |
ColumnHeaderTemplate | DataTemplate | Custom column header | Branding or additional info |
SwimlaneHeaderTemplate | DataTemplate | Custom swim lane header | Custom swim lane display |
MinColumnWidth | double | Minimum column width | Responsive layouts |
MaxColumnWidth | double | Maximum column width | Controlling column size |
ColumnWidth | double | Fixed column width | Uniform column sizing |
SortingMappingPath | string | Property for sorting cards | Ordering cards by priority/date |
SortingOrder | enum | Ascending or Descending | Sort direction |
Workflows | Collection | Allowed card transitions | Workflow validation |
IndicatorColorPalette | Collection | Color mapping for indicators | Priority/status colors |
IsToolTipEnabled | bool | Enable card tooltips | Additional card info on hover |
| Property | Type | Purpose | When to Use |
|---|---|---|---|
Title | string | Column display name | Custom column titles |
Categories | string | Comma-separated categories | Mapping data to column |
MinimumLimit | int | WIP minimum limit | Workflow management |
MaximumLimit | int | WIP maximum limit | Preventing overload |
AllowDrag | bool | Enable dragging from column | Controlling card movement |
AllowDrop | bool | Enable dropping to column | Restricting drops |
IsExpanded | bool | Column collapsed/expanded state | UI state control |
| Property | Type | Description | Display Location |
|---|---|---|---|
Title | string | Card heading | Top, bold text |
ID | object | Unique identifier | Not displayed in default UI |
Description | string | Detailed text | Below title |
Category | object | Column assignment | Determines column placement |
Assignee | string | Assigned person | Used for swim lane grouping |
ColorKey | object | Priority/status key | Color bar on card |
Tags | string[] | Labels/categories | Bottom of card |
ImageURL | Uri | Avatar/icon | Right side of card |
Scenario: Track bugs and features through development stages
Scenario: Organize tasks by team members with swim lanes
Scenario: Sort cards by priority within each column
Scenario: Handle card taps to show details dialog
Symptoms: Kanban board is empty, no columns visible
Solutions:
Symptoms: Columns show but cards are missing
Solutions:
Symptoms: Cannot move cards between columns
Solutions:
Symptoms: Visual indicators not showing for WIP limits
Solutions:
Symptoms: All cards in single row, no swim lanes
Solutions:
Symptoms: Cards not sorted after drag-and-drop
Solutions:
Multiple Categories per Column:
Categories="Open,New,Backlog"Custom Model Requirements:
Workflow Restrictions:
Sorting with Drag-Drop:
Swim Lane Grouping:
using Syncfusion.UI.Xaml.Kanban;
public class ViewModel
{
public ObservableCollection<KanbanModel> TaskDetails { get; set; }
public ViewModel()
{
TaskDetails = new ObservableCollection<KanbanModel>
{
new KanbanModel
{
Title = "UWP Issue",
ID = "651",
Description = "Fix crosshair label template issue",
Category = "Open",
ColorKey = "High",
Tags = new string[] { "Bug Fixing" }
},
new KanbanModel
{
Title = "Kanban Feature",
ID = "25678",
Description = "Implement drag and drop support",
Category = "In Progress",
ColorKey = "Normal",
Tags = new string[] { "New Feature" }
}
};
}
}<kanban:SfKanban AutoGenerateColumns="False"
ItemsSource="{Binding TaskDetails}">
<kanban:KanbanColumn Title="To Do" Categories="Open" />
<kanban:KanbanColumn Title="In Progress" Categories="In Progress" />
<kanban:KanbanColumn Title="Done" Categories="Done" />
</kanban:SfKanban>// Columns automatically generated from Category property values
kanban.AutoGenerateColumns = true;
kanban.ItemsSource = viewModel.TaskDetails;<kanban:KanbanColumn Title="In Progress"
Categories="In Progress"
MinimumLimit="2"
MaximumLimit="5" /><kanban:SfKanban.CardTemplate>
<DataTemplate>
<Border Background="#F3CFCE"
BorderThickness="1"
CornerRadius="3">
<StackPanel Margin="10">
<TextBlock Text="{Binding Title}"
FontWeight="Bold"
FontSize="14" />
<TextBlock Text="{Binding Description}"
FontSize="12"
TextWrapping="Wrap" />
</StackPanel>
</Border>
</DataTemplate>
</kanban:SfKanban.CardTemplate><kanban:SfKanban SwimlaneKey="Assignee"
ItemsSource="{Binding TaskDetails}">
<!-- Cards grouped by Assignee property -->
</kanban:SfKanban><kanban:SfKanban.Workflows>
<kanban:KanbanWorkflow Category="Open">
<kanban:KanbanWorkflow.AllowedTransitions>
<x:String>In Progress</x:String>
</kanban:KanbanWorkflow.AllowedTransitions>
</kanban:KanbanWorkflow>
<kanban:KanbanWorkflow Category="In Progress">
<kanban:KanbanWorkflow.AllowedTransitions>
<x:String>Done</x:String>
<x:String>Won't Fix</x:String>
</kanban:KanbanWorkflow.AllowedTransitions>
</kanban:KanbanWorkflow>
</kanban:SfKanban.Workflows>// Custom model
public class TaskDetails
{
public string Title { get; set; }
public string Description { get; set; }
public string Status { get; set; }
}
// XAML
<kanban:SfKanban ItemsSource="{Binding Tasks}"
ColumnMappingPath="Status">
<kanban:SfKanban.CardTemplate>
<!-- Define custom template -->
</kanban:SfKanban.CardTemplate>
</kanban:SfKanban><kanban:SfKanban ItemsSource="{Binding Issues}">
<kanban:KanbanColumn Title="Backlog" Categories="Open,New" />
<kanban:KanbanColumn Title="In Development"
Categories="In Progress"
MaximumLimit="3" />
<kanban:KanbanColumn Title="Testing"
Categories="Testing"
MaximumLimit="5" />
<kanban:KanbanColumn Title="Done"
Categories="Closed,Resolved" />
</kanban:SfKanban><kanban:SfKanban SwimlaneKey="Assignee"
ItemsSource="{Binding ProjectTasks}">
<kanban:SfKanban.SwimlaneHeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Image}" Width="30" Height="30"/>
<TextBlock Text="{Binding Title}" Margin="10,0"/>
</StackPanel>
</DataTemplate>
</kanban:SfKanban.SwimlaneHeaderTemplate>
</kanban:SfKanban><kanban:SfKanban SortingMappingPath="Priority"
SortingOrder="Descending"
ItemsSource="{Binding Tasks}"
CardDragEnd="OnCardDrop">
<!-- Columns -->
</kanban:SfKanban> private void OnCardDrop(object sender, KanbanDragEndEventArgs e)
{
kanban.RefreshKanbanColumn(e.TargetKey.ToString());
}kanban.CardTapped += (s, e) => {
var card = e.SelectedCard.DataContext as KanbanModel;
var dialog = new TaskDetailsDialog(card);
await dialog.ShowAsync();
};