Repository navigation
combobox: custom content cannot be written - the slot is refused (MDL-WIDGET26) and CustomContentType 'yes' alone fails mx check CE0642 #1663
Description
mxcli v0.28.0 (2026-10-23) · Mendix 11.14.0 (blank repro project, Combo box 2.10.0 .mpk added) — first hit in an 11.15.0 app · OS Windows Server 2025
Summary
The Combo box's custom content cannot be written. mxcli widget describe combobox lists
optionsSourceAssociationCustomContent / optionsSourceDatabaseCustomContent / staticDataSourceCustomContent as properties of
type widgets, but writing widgets into the slot is refused - MDL-WIDGET26 "optionssourceassociationcustomcontent is not a
container of combobox, which declares no containers". The enumeration that switches it on is written, so
optionsSourceAssociationCustomContentType: 'yes' on its own passes check and exec and then fails mx check with
CE0642 "Property 'Custom content' is required."
Custom content is how a combo box shows more than one attribute per option (in our case a person's English and Arabic name, one
of which the theme hides by language - the caption has to stay a single attribute or expression for filtering).
Related, not a duplicate: #1631 (closed) - alter page replace of a combo box kept the old combo box's custom content, which
describe never shows.
Minimal repro
CREATE MODULE ModB;
CREATE OR MODIFY PERSISTENT ENTITY ModB.Person ( NameEN: String(200), NameAR: String(200) );
CREATE OR MODIFY NON-PERSISTENT ENTITY ModB.Choice ( Note: String(20) );
CREATE OR MODIFY ASSOCIATION ModB.Choice_Person FROM ModB.Choice TO ModB.Person TYPE Reference OWNER Default;
CREATE OR MODIFY MICROFLOW ModB.DS_Choice () RETURNS ModB.Choice AS $Choice
BEGIN
$Made = CREATE ModB.Choice ( Note = '' );
RETURN $Made;
END;
CREATE OR MODIFY PAGE ModB.ChoosePage ( Title: 'Choose', Layout: Atlas_Core.Atlas_Default ) {
DATAVIEW dvChoice (DataSource: MICROFLOW ModB.DS_Choice) {
COMBOBOX cbPerson (
Label: 'Person',
Association: ModB.Choice_Person,
DataSource: DATABASE ModB.Person,
CaptionAttribute: NameEN,
optionsSourceAssociationCustomContentType: 'yes'
) {
optionssourceassociationcustomcontent cc {
DYNAMICTEXT ccEn (Content: '{1}', ContentParams: ({1} = NameEN))
DYNAMICTEXT ccAr (Content: '{1}', ContentParams: ({1} = NameAR))
}
}
}
};(ewo_cb2.mdl is the same page without the { … } body.)
Expected
The slot is a container of combobox (as tagcontentcontainer is of htmlelement), its widgets are written into
optionsSourceAssociationCustomContent (the database and static variants alike), and describe page prints them back.
Actual
$ mxcli check <repro>/scripts/ewo_cb.mdl -p Repro.mpr --references
✗ page ModB.ChoosePage: `optionssourceassociationcustomcontent` is not a container of `combobox`, which declares no containers [MDL-WIDGET26]
$ mxcli exec <repro>/scripts/ewo_cb2.mdl -p Repro.mpr (no body: only the type)
Created page ModB.ChoosePage
$ mxcli -p Repro.mpr -c "describe page ModB.ChoosePage"
combobox cbPerson (
Label: 'Person',
Attribute: Choice_Person,
DataSource: database from ModB.Person,
CaptionAttribute: NameEN,
optionsSourceAssociationCustomContentType: 'yes'
)
$ mx check Repro.mpr
[error] [CE0642] "Property 'Custom content' is required." at Widgets container 'Custom content' of combo box 'cbPerson'
(The same mx check run lists CE0463 on the blank project's own combo boxes: they predate the 2.10.0 .mpk dropped in for the
repro and are unrelated.)
What narrows it down
| Variant | Result |
|---|---|
slot written as a body container (optionssourceassociationcustomcontent cc { … }) |
MDL-WIDGET26, refused |
…CustomContentType: 'yes' only |
written; mx check CE0642 |
…CustomContentType: 'no' (default) |
fine |
Suggestions
- Declare the three
…CustomContentproperties as containers ofcombobox(thewidgets-typed properties of other pluggable
widgets already work this way), and write and describe their widgets. - Until then,
checkcould refuse…CustomContentType: 'yes' | 'listItem'without content: it is a guaranteed CE0642.
Workaround we use
Two combo boxes on the same association, one captioned with the English attribute and one with an expression on the Arabic one,
each with a class the theme shows by language. It works, but it doubles every picker (and its data source call) where one widget
with custom content would do.
Session log (isolated HOME, paths redacted)
{"time":"2026-10-27T15:32:24.7221301+03:00","level":"INFO","msg":"session_start","version":"v0.28.0","go":"go1.27.3","os":"windows","arch":"amd64","mode":"mxcli check","args":["mxcli","check","<repro>/scripts/ewo_cb.mdl","-p","Repro.mpr","--references"],"pid":63592,"parent_pid":""}
{"time":"2026-10-27T15:32:26.8684808+03:00","level":"INFO","msg":"connect","mpr_path":"Repro.mpr","mendix_version":"11.14.0","mpr_format":2}
{"time":"2026-10-27T15:32:26.8684808+03:00","level":"INFO","msg":"execute","stmt_type":"ConnectStmt","stmt_summary":"connect local 'Repro.mpr'","duration_ms":1}
{"time":"2026-10-27T15:32:27.6456789+03:00","level":"INFO","msg":"session_start","version":"v0.28.0","go":"go1.27.3","os":"windows","arch":"amd64","mode":"mxcli exec","args":["mxcli","exec","<repro>/scripts/ewo_cb2.mdl","-p","Repro.mpr"],"pid":21728,"parent_pid":""}
{"time":"2026-10-27T15:32:27.6958598+03:00","level":"INFO","msg":"connect","mpr_path":"Repro.mpr","mendix_version":"11.14.0","mpr_format":2}
{"time":"2026-10-27T15:32:27.6958598+03:00","level":"INFO","msg":"execute","stmt_type":"ConnectStmt","stmt_summary":"connect local 'Repro.mpr'","duration_ms":1}
{"time":"2026-10-27T15:32:28.425358+03:00","level":"INFO","msg":"execute","stmt_type":"CreateModuleStmt","stmt_summary":"create module ModB","duration_ms":117}
{"time":"2026-10-27T15:32:28.5002902+03:00","level":"INFO","msg":"execute","stmt_type":"CreateEntityStmt","stmt_summary":"create entity ModB.Person","duration_ms":74}
{"time":"2026-10-27T15:32:28.564366+03:00","level":"INFO","msg":"execute","stmt_type":"CreateEntityStmt","stmt_summary":"create entity ModB.Choice","duration_ms":64}
{"time":"2026-10-27T15:32:28.636341+03:00","level":"INFO","msg":"execute","stmt_type":"CreateAssociationStmt","stmt_summary":"create association ModB.Choice_Person","duration_ms":71}
{"time":"2026-10-27T15:32:28.7106185+03:00","level":"INFO","msg":"execute","stmt_type":"CreateMicroflowStmt","stmt_summary":"create microflow ModB.DS_Choice","duration_ms":74}
{"time":"2026-10-27T15:32:28.8394626+03:00","level":"INFO","msg":"execute","stmt_type":"CreatePageStmtV3","stmt_summary":"create page ModB.ChoosePage","duration_ms":128}
{"time":"2026-10-27T15:32:28.8533038+03:00","level":"INFO","msg":"session_end","commands_executed":7,"errors_count":0,"duration_s":1,"pid":21728}
{"time":"2026-10-27T15:32:29.4975274+03:00","level":"INFO","msg":"session_start","version":"v0.28.0","go":"go1.27.3","os":"windows","arch":"amd64","mode":"batch","args":["mxcli","-p","Repro.mpr","-c","describe page ModB.ChoosePage"],"pid":69908,"parent_pid":""}
{"time":"2026-10-27T15:32:29.554312+03:00","level":"INFO","msg":"connect","mpr_path":"Repro.mpr","mendix_version":"11.14.0","mpr_format":2}
{"time":"2026-10-27T15:32:29.5546407+03:00","level":"INFO","msg":"execute","stmt_type":"ConnectStmt","stmt_summary":"connect local 'Repro.mpr'","duration_ms":2}
{"time":"2026-10-27T15:32:29.6397359+03:00","level":"INFO","msg":"execute","stmt_type":"DescribeStmt","stmt_summary":"describe PAGE ModB.ChoosePage","duration_ms":69}
{"time":"2026-10-27T15:32:29.6397359+03:00","level":"INFO","msg":"session_end","commands_executed":2,"errors_count":0,"duration_s":0,"pid":69908}
{"time":"2026-10-27T15:32:39.4901292+03:00","level":"INFO","msg":"session_start","version":"v0.28.0","go":"go1.27.3","os":"windows","arch":"amd64","mode":"mxcli widget describe","args":["mxcli","widget","describe","combobox","-p","Repro.mpr"],"pid":25428,"parent_pid":""}
{"time":"2026-10-27T15:32:39.6753506+03:00","level":"INFO","msg":"session_end","commands_executed":0,"errors_count":0,"duration_s":0,"pid":25428}
Activity
Merge pull request mendixlabs#1663 from ako/claude/cool-keller-jtch0r