Imported from AleksaRistic216/dotnet-playground (
.github/skills/wpf/wpf-devexpress-scheduler/SKILL.md). Install upstream withnpx skills add AleksaRistic216/dotnet-playground --skill wpf-devexpress-scheduler. Copyright stays with the author.
DevExpress WPF Scheduler Control
DevExpress.Xpf.Scheduling.SchedulerControl is a full-featured calendar / scheduling control: appointments, recurring activities, resources (people, rooms, equipment), labels, statuses, time regions, reminders, time zones. Seven view types out of the box (Day / Work Week / Week / Month / Timeline / Agenda / List). Bind to a data source through DataSource.AppointmentsSource + AppointmentMappings, or use the unbound mode for runtime-managed data.
When to Use This Skill
Use this skill when you need to:
- Add a calendar / scheduling view to a WPF app
- Display recurring appointments, all-day events, multi-day events
- Group appointments by resource (people, rooms, equipment) or by date
- Bind to a data source via mappings β
AppointmentMappings,ResourceMappings, custom fields - Switch among the seven view types
- Customize appointment look via templates, styles, brushes
- Manage labels, statuses, time regions, reminders
- Implement an Outlook-clone in WPF
Prerequisites & Installation
NuGet Packages
| Package | Purpose |
|---|---|
DevExpress.Wpf.Scheduling |
Main package β SchedulerControl, all view types, all item types |
DevExpress.Wpf.Ribbon |
Required if you use Quick Actions β "Create Ribbon" to add ribbon UI |
DevExpress.Wpf.Printing |
Required for the Scheduler's print preview / export |
DevExpress.Wpf.Scheduling transitively brings DevExpress.Wpf.Core (themes, MVVM helpers).
.NET (6/7/8+)
dotnet add package DevExpress.Wpf.Scheduling
Add to .csproj:
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
All DevExpress packages in a project must share the same version. A valid DevExpress license is required.
Before You Start β Ask the Developer
- Target framework: .NET 8+, .NET 6/7, or .NET Framework 4.x?
- Bound or unbound: Does the scheduler persist data to an external source (DB, file, EF), or run with in-memory data created at runtime?
- Data model: What classes represent appointments and resources? Map their fields to the Scheduler's properties via
AppointmentMappings/ResourceMappings. See data-binding.md. - Grouping:
None(a single timeline),Resource(one lane per resource),Date(lanes by date)? - Active view: Day, Work Week, Week, Month, Timeline, Agenda, or List? Each has its own configuration. See views.md.
- Recurrence: Are recurring appointments required? Yes β add
RecurrenceInfoandTypemappings. - Appearance: Need custom appointment look (templates, styles), color themes (brushes), or both?
Component Overview
XAML Namespace
xmlns:dxsch="http://schemas.devexpress.com/winfx/2008/xaml/scheduling"
xmlns:dxschv="http://schemas.devexpress.com/winfx/2008/xaml/scheduling/visual"
dxsch: covers the main SchedulerControl, views, mappings, item types. dxschv: is for visual elements (AppointmentContentPanel, AppointmentIntervalSubjectPresenter, etc.) used inside custom templates.
Element Hierarchy
SchedulerControl
βββ DataSource
β βββ AppointmentsSource β bound collection of appointments
β βββ ResourcesSource β bound collection of resources
β βββ AppointmentLabelsSource β bound collection of labels
β βββ AppointmentStatusesSource β bound collection of statuses
β βββ TimeRegionsSource β bound collection of time regions
β βββ AppointmentMappings β field-to-property bindings (Start, End, Subject, etc.)
β βββ ResourceMappings β field-to-property bindings (Id, Caption, Brush)
β βββ AppointmentLabelMappings
β βββ AppointmentStatusMappings
β βββ TimeRegionMappings
βββ Views β collection of view types (Day, Week, Month, etc.)
βββ AppointmentItems β imperative collection (unbound mode)
βββ ResourceItems β imperative collection (unbound mode)
βββ LabelItems / StatusItems / TimeRegionItems
βββ BrushSet β color palette for resources/labels/statuses
βββ BrushProvider β theme-aware brush customization
Two Operation Modes
| Mode | When | How |
|---|---|---|
| Bound | Production app, data persisted to DB / file / EF / API | Set DataSource.AppointmentsSource (and others) + AppointmentMappings |
| Unbound | Quick prototype, data managed in-memory at runtime | Use SchedulerControl.AppointmentItems (and other *Items collections) directly |
Mixed mode is supported: appointments via DataSource, but labels/statuses created inline via LabelItems / StatusItems.
Documentation & Navigation Guide
Getting Started
Refer to references/getting-started.md
When you need to:
- Set up a .NET project with
DevExpress.Wpf.Scheduling - Build the minimum viable scheduler β view, data model, bindings
- Add a Ribbon UI for the scheduler (Quick Actions β "Create Ribbon")
Data Binding
Refer to references/data-binding.md
When you need to:
- Bind appointments, resources, labels, statuses, time regions
- Define mappings β
AppointmentMappings,ResourceMappings, etc. - Use
CustomFieldMappingfor project-specific extra fields - Implement load-on-demand for large data sets
- Use Mapping Converters for custom storage formats (e.g.,
stringβRecurrenceInfo)
Data Items (Appointments, Resources, Labels, Statuses, Time Regions, Reminders)
Refer to references/data-items.md
When you need to:
- Understand what each item type represents
- Configure recurring appointments (
AppointmentType.Pattern+RecurrenceInfo) - Define labels (categories) and statuses (availability) for appointments
- Block off time ranges with time regions
- Set reminders on appointments
View Modes
Refer to references/views.md
When you need to:
- Pick between Day / Work Week / Week / Month / Timeline / Agenda / List views
- Configure view-specific properties (visible time, day count, work time only)
- Group by resource or date (
GroupType) - Switch views at runtime (
ActiveViewIndex) - Use multiple views of the same type with different settings
Appearance Customization (Styles and Templates)
Refer to references/styles-and-templates.md
When you need to:
- Override the appointment content template (
AppointmentContentTemplate) - Use the built-in appointment presenters (
AppointmentIntervalSubjectPresenter,AppointmentLocationPresenter,AppointmentDescriptionPresenter,AppointmentImagesPanel) - Apply per-view styles (
AppointmentStyle) - Customize colors via
BrushSet/BrushName - Use
BrushProviderfor theme-aware customization (resource cells, headers, navigation buttons) - Choose between New (Outlook2019) and Classic UI styles
Quick Start Example
See the runnable quickstart sample in examples/quickstart.cs. If the sample includes companion XAML or resources, keep them alongside the C# entry point in the same examples/ folder.
The following XAML shows the core SchedulerControl setup used by that quickstart:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxsch="http://schemas.devexpress.com/winfx/2008/xaml/scheduling"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
xmlns:vm="clr-namespace:MyApp.ViewModels"
Title="Calendar" Height="600" Width="900"
DataContext="{dxmvvm:ViewModelSource vm:MainViewModel}">
<dxsch:SchedulerControl GroupType="Resource"
FirstDayOfWeek="Monday"
ActiveViewIndex="0">
<dxsch:SchedulerControl.DataSource>
<dxsch:DataSource ResourcesSource="{Binding Doctors}"
AppointmentsSource="{Binding Appointments}">
<dxsch:DataSource.ResourceMappings>
<dxsch:ResourceMappings Id="Id" Caption="Name"/>
</dxsch:DataSource.ResourceMappings>
<dxsch:DataSource.AppointmentMappings>
<dxsch:AppointmentMappings
Type="Type"
Start="StartTime"
End="EndTime"
Subject="PatientName"
Location="Location"
Description="Notes"
AllDay="AllDay"
Id="Id"
ResourceId="DoctorId"
StatusId="StatusId"
LabelId="CategoryId"
RecurrenceInfo="RecurrenceInfo"
Reminder="ReminderInfo"/>
</dxsch:DataSource.AppointmentMappings>
</dxsch:DataSource>
</dxsch:SchedulerControl.DataSource>
</dxsch:SchedulerControl>
</Window>
Key Properties & API Surface
SchedulerControl
| Property | Use |
|---|---|
DataSource |
DataSource object holding all bindings and mappings |
Views |
Collection of view objects (Day, Week, etc.) |
ActiveViewIndex |
Index into Views β picks the displayed view |
GroupType |
None, Resource, Date |
FirstDayOfWeek |
Sunday, Monday, etc. β affects Week / Work Week views |
WorkDays / WorkTime / CustomWorkTime |
Work-hours / work-days configuration |
AppointmentItems / ResourceItems / LabelItems / StatusItems / TimeRegionItems |
Imperative collections (unbound mode) |
SelectedAppointments |
Currently selected appointments |
BrushSet / BrushProvider |
Color customization |
AppointmentAdding/AppointmentAdded, AppointmentRemoving/AppointmentRemoved, AppointmentEditing/AppointmentEdited, AppointmentRestoring/AppointmentRestored |
Lifecycle events for tracking appointment changes. The cancelable *ing pre-events validate/veto an operation (e.Cancel); the *ed post-events carry AppointmentCRUDEventArgs (AddToSource / UpdateInSource / DeleteFromSource) for persisting to the data store |
DataSource (Bound Mode)
Bindings and mappings live inside this object. Use either <dxsch:SchedulerControl.DataSource> element syntax or assign in code.
View Classes
DayView, WorkWeekView, WeekView, MonthView, TimelineView, AgendaView, ListView β each is a ViewBase descendant with its own configuration properties. See views.md.
Common Patterns
Pattern 1: Minimal Unbound Scheduler
<dxsch:SchedulerControl/>
That's it. The scheduler shows today, lets users create appointments by selecting time cells and typing. Appointments live in memory β they're lost on app close.
Pattern 2: Bound to ViewModel Collections
<dxsch:SchedulerControl>
<dxsch:SchedulerControl.DataSource>
<dxsch:DataSource AppointmentsSource="{Binding Appointments}"
ResourcesSource="{Binding Resources}">
<dxsch:DataSource.AppointmentMappings>
<dxsch:AppointmentMappings Start="StartTime"
End="EndTime"
Subject="Title"
ResourceId="ResourceId"/>
</dxsch:DataSource.AppointmentMappings>
<dxsch:DataSource.ResourceMappings>
<dxsch:ResourceMappings Id="Id" Caption="Name"/>
</dxsch:DataSource.ResourceMappings>
</dxsch:DataSource>
</dxsch:SchedulerControl.DataSource>
</dxsch:SchedulerControl>
Start and End are the only required mappings for non-recurring appointments. Recurring ones additionally need Type and RecurrenceInfo.
Pattern 3: Pre-Configure Views in XAML
<dxsch:SchedulerControl ActiveViewIndex="0">
<dxsch:DayView DayCount="2"/>
<dxsch:WorkWeekView/>
<dxsch:MonthView/>
</dxsch:SchedulerControl>
Adding any view to the Views collection in XAML overrides the default "all views enabled" behavior β only the listed views are active.
Pattern 4: Custom Appointment Template
<dxsch:DayView>
<dxsch:DayView.AppointmentContentTemplate>
<DataTemplate>
<dxschv:AppointmentContentPanel>
<dxschv:AppointmentContentPanel.IntervalSubject>
<dxschv:AppointmentIntervalSubjectPresenter WordWrap="True" FontWeight="Bold"/>
</dxschv:AppointmentContentPanel.IntervalSubject>
<dxschv:AppointmentContentPanel.Description>
<dxschv:AppointmentDescriptionPresenter Margin="0,2,0,0"/>
</dxschv:AppointmentContentPanel.Description>
</dxschv:AppointmentContentPanel>
</DataTemplate>
</dxsch:DayView.AppointmentContentTemplate>
</dxsch:DayView>
Troubleshooting
| Symptom | Cause | Solution |
|---|---|---|
dxsch: prefix unresolved |
Missing namespace or NuGet package | Add xmlns:dxsch="http://schemas.devexpress.com/winfx/2008/xaml/scheduling"; install DevExpress.Wpf.Scheduling. |
| Appointments don't appear | AppointmentsSource binding wrong, or required Start/End mappings not set |
Verify the binding source and that the mapping property names match data class members exactly (case-sensitive). |
| Recurring appointments expand wrong / not at all | Missing Type and RecurrenceInfo mappings |
Both are required for recurrence. RecurrenceInfo is typically stored as a string (XML form); use a Mapping.Converter if your storage format differs. |
| Changes to appointments don't persist | Unbound mode; or no two-way persistence layer | Switch to bound mode with an external store, or subscribe to the AppointmentAdded / AppointmentRemoved / AppointmentEdited events to detect changes for manual save. |
error CS0104: 'Application' is an ambiguous reference |
DevExpress.Wpf.Scheduling transitively references System.Windows.Forms; <ImplicitUsings>enable</ImplicitUsings> on .NET 6+ creates the clash |
Qualify System.Windows.Application in App.xaml.cs. |
| Wrong view shows | ActiveViewIndex doesn't match the position in Views |
Indexes are 0-based; verify the order of <dxsch:DayView/>, <dxsch:WeekView/>, etc. in XAML. |
| Multiple resource bars don't appear | GroupType="None" |
Set GroupType="Resource" to render one lane per resource. |
| Resource colors don't apply | Brush / BrushName not set on the resource items, or theme overrides |
Set ResourceMappings.Brush / BrushName, or use BrushSet to define a palette. See styles-and-templates.md. |
| List view has no filter when paired with DateNavigator | By design β DateNavigator can't filter List view | Use the List view's built-in filtering UI instead. |
Constraints & Rules
CRITICAL β follow these rules in every interaction:
- Build verification: After changes, run
dotnet buildand report errors before claiming success. - Target framework: Windows-only (
net{X}-windows,UseWPF=true). - NuGet: Use
DevExpress.Wpf.Scheduling. All DevExpress packages share one version. - XAML namespace:
dxsch:(scheduling),dxschv:(visual presenters used inside templates). - Required mappings:
StartandEndare always required inAppointmentMappings. For recurring appointments, alsoTypeandRecurrenceInfo. - Mapping names are case-sensitive and must match the data class's property names exactly.
- Don't mix
*Itemsand*Sourcefor the same item type. Pick one mode per item type β bound (*Source+ mappings) or unbound (*Itemsdirectly). - Application ambiguity: When generating
App.xaml.cson .NET 6+, qualifySystem.Windows.Application.
Using DevExpress Documentation MCP
- Search:
devexpress_docs_search(technology="WPF Scheduler", query="<your question>") - Fetch:
devexpress_docs_get_content(url="<documentation URL>")
Use MCP for: Outlook 365 integration, drag-and-drop customization, custom edit dialogs, time-zone handling, printing-template authoring, Save / Load layout β these are deep specialized topics beyond the core references.
Next Steps
Start with Getting Started for .NET 6/7/8+ project setup, or Getting Started (.NET Framework) for .NET Framework 4.6.2+ projects. Then use Data Binding for the mappings, Data Items to understand the model, Views to pick a view, and Styles and Templates for appearance.