DxSchedulerCustomFieldMapping Class
Specifies how a source object’s custom fields are mapped to custom properties of a scheduler item (appointment, label, or status).
Namespace: DevExpress.Blazor
Assembly: DevExpress.Blazor.v25.2.dll
NuGet Package: DevExpress.Blazor
Declaration
public class DxSchedulerCustomFieldMapping :
BindableBase
Remarks
The DevExpress Blazor Scheduler works with the DxSchedulerDataStorage object that contains source data for the following objects:
- DxSchedulerAppointmentItem
- DxSchedulerAppointmentLabelItem
- DxSchedulerAppointmentStatusItem
- DxSchedulerResourceItem
These items contain predefined sets of properties. When you bind a Scheduler to data, you map these properties to data source fields (see the AppointmentMappings, AppointmentLabelMappings, AppointmentStatusMappings, ResourceMappings properties).
You can add custom properties to Scheduler items:
- Define custom fields in source objects. These objects must have both getter and setter, and must not implement the readonly modifier.
- Add created fields to the CustomFieldMappings collection.
You can use custom properties in appointment templates and custom appointment forms.
Add a Custom Field to an Appointment
The following code snippet implements the following scenario:
- Adds a custom field (
Accepted) to an appointment’s source object. - Maps the field to the
IsAcceptedappointment property. - Uses the property value in VerticalAppointmentTemplate and HorizontalAppointmentTemplate (
@context.CustomFields[...])).
<DxScheduler @ref="Scheduler"
@bind-StartDate="@StartDate" DataStorage="@DataStorage"
@bind-ActiveViewType="@ActiveViewType"
AppointmentFormShowing="OnAppointmentFormShowing"
ValidateEditForm="true" CssClass="demo-sc-size"
@bind-AppointmentFormMode="@AppointmentFormMode">
<Views>
<DxSchedulerWorkWeekView VisibleTime="@(new DxSchedulerTimeSpanRange(TimeSpan.FromHours(8), TimeSpan.FromHours(19)))">
<HorizontalAppointmentTemplate>
<div class="demo-sc-apt @(IsAccepted(context.CustomFields) ? "demo-sc-accepted " : "") w-100">
<div class="card demo-apt-bg dxbl-purple-color w-100"></div>
<div class="card shadow-sm p-1 demo-sc-apt-content text-white w-100">
@context.Appointment.Subject
</div>
</div>
</HorizontalAppointmentTemplate>
<VerticalAppointmentTemplate>
<div class="shadow-sm demo-sc-apt @(IsAccepted(context.CustomFields) ? "demo-sc-accepted" : "")">
<div class="card demo-apt-bg dxbl-purple-color"></div>
<div class="card demo-sc-apt-content text-white">
<div class="card demo-sc-status-container">
<div class="card demo-apt-status dxbl-purple-color"></div>
</div>
<div class="demo-apt-subject">
@context.Appointment.Subject
</div>
</div>
</div>
</VerticalAppointmentTemplate>
</DxSchedulerWorkWeekView>
</Views>
@* ... *@
</DxScheduler>
@* ... *@
@code {
DxScheduler Scheduler { get; set; }
SchedulerAppointmentFormMode AppointmentFormMode { get; set; } = SchedulerAppointmentFormMode.Both;
List<SchedulerAppointmentFormMode> EditModes = Enum.GetValues(typeof(SchedulerAppointmentFormMode))
.OfType<SchedulerAppointmentFormMode>()
.ToList();
DateTime StartDate { get; set; } = DateTime.Today;
SchedulerViewType ActiveViewType { get; set; } = SchedulerViewType.WorkWeek;
public class CustomAppointmentFormInfo : SchedulerAppointmentFormInfo {
public CustomAppointmentFormInfo(DxSchedulerAppointmentItem AppointmentItem, DxSchedulerDataStorage DataStorage, DxScheduler scheduler) : base(AppointmentItem, DataStorage, scheduler) { }
[Required]
public override string Subject {
get { return base.Subject; }
set { base.Subject = value; }
}
public bool IsAccepted {
get { return IsAccepted(CustomFields); }
set { CustomFields["IsAccepted"] = value; }
}
}
void OnAppointmentFormShowing(SchedulerAppointmentFormEventArgs args) {
args.FormInfo = new CustomAppointmentFormInfo(args.Appointment, DataStorage, Scheduler);
}
static bool IsAccepted(DxExpandoDictionaryObject customFields) => true == (bool?)customFields["IsAccepted"];
DxSchedulerDataStorage DataStorage = new DxSchedulerDataStorage() {
AppointmentsSource = AppointmentCollection.GetAppointments(),
AppointmentMappings = new DxSchedulerAppointmentMappings() {
Type = "AppointmentType",
Start = "StartDate",
End = "EndDate",
Subject = "Caption",
AllDay = "AllDay",
Location = "Location",
Description = "Description",
CustomFieldMappings = new List<DxSchedulerCustomFieldMapping> {
new DxSchedulerCustomFieldMapping { Name = "IsAccepted", Mapping = "Accepted" }
}
}
};
}

Add a Custom Field to a Label
The following code snippet adds a custom field to LabelObject and maps this field to the appointment label’s custom property:
@code {
public class LabelObject {
public int Id { get; set; }
public string LabelName { get; set; }
public System.Drawing.Color LabelColor { get; set; }
public string MyCustomField { get; set; } // a custom field
}
DxSchedulerDataStorage DataStorage = new DxSchedulerDataStorage() {
AppointmentLabelsSource = new List<LabelObject>() {
new LabelObject() {
Id = 1,
LabelName = "Label One",
LabelColor = System.Drawing.Color.Aqua,
MyCustomField = "custom text for Label One"
},
new LabelObject() {
Id = 2,
LabelName = "Label Two",
LabelColor = System.Drawing.Color.Beige,
MyCustomField = "custom text for Label Two"
},
},
AppointmentLabelMappings = new DxSchedulerAppointmentLabelMappings() {
Id = "Id",
Caption = "LabelName",
Color = "LabelColor",
// Map the source object's custom field to the label's custom property
CustomFieldMappings = new List<DxSchedulerCustomFieldMapping> {
new DxSchedulerCustomFieldMapping { Name = "MyCustomProperty", Mapping = "MyCustomField" }
}
}
};
}
Refer to AppointmentLabelMappings for additional information.