{"record":{"id":"e97e1e5e6481d334","repo":"dotnet/maui","slug":"cannot-convert-strvalue-into-typeof-buttoncon","errorCode":null,"errorMessage":"Cannot convert \"{strValue}\" into {typeof(ButtonContentLayout)}","messagePattern":"Cannot convert \"(.+?)\" into (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Controls/src/Core/Button/Button.cs","lineNumber":590,"sourceCode":"\t\tpublic sealed class ButtonContentTypeConverter : TypeConverter\n\t\t{\n\t\t\tpublic override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)\n\t\t\t\t=> sourceType == typeof(string);\n\n\t\t\tpublic override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)\n\t\t\t\t=> false;\n\n\t\t\tpublic override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)\n\t\t\t{\n\t\t\t\t// IMPORTANT! Update ButtonContentDesignTypeConverter.IsValid if making changes here\n\t\t\t\tvar strValue = value?.ToString();\n\t\t\t\tif (strValue == null)\n\t\t\t\t\tthrow new InvalidOperationException($\"Cannot convert null into {typeof(ButtonContentLayout)}\");\n\n\t\t\t\tstring[] parts = strValue.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);\n\n\t\t\t\tif (parts.Length != 1 && parts.Length != 2)\n\t\t\t\t\tthrow new InvalidOperationException($\"Cannot convert \\\"{strValue}\\\" into {typeof(ButtonContentLayout)}\");\n\n\t\t\t\tdouble spacing = DefaultSpacing;\n\t\t\t\tvar position = ButtonContentLayout.ImagePosition.Left;\n\n\t\t\t\tvar spacingFirst = char.IsDigit(parts[0][0]);\n\n\t\t\t\tint positionIndex = spacingFirst ? (parts.Length == 2 ? 1 : -1) : 0;\n\t\t\t\tint spacingIndex = spacingFirst ? 0 : (parts.Length == 2 ? 1 : -1);\n\n\t\t\t\tif (spacingIndex > -1)\n\t\t\t\t\tspacing = double.Parse(parts[spacingIndex], CultureInfo.InvariantCulture);\n\n\t\t\t\tif (positionIndex > -1)\n\t\t\t\t\tposition = (ButtonContentLayout.ImagePosition)Enum.Parse(typeof(ButtonContentLayout.ImagePosition), parts[positionIndex], true);\n\n\t\t\t\treturn new ButtonContentLayout(position, spacing);\n\t\t\t}\n","sourceCodeStart":572,"sourceCodeEnd":608,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Controls/src/Core/Button/Button.cs#L572-L608","documentation":"Thrown by ButtonContentLayoutTypeConverter.ConvertFrom when the string splits into a number of parts (comma-separated, empties removed) that is neither 1 nor 2. The layout string must be a single position keyword or a spacing+position pair (in either order).","triggerScenarios":"Strings like \"Left,Top,Right\" (3 parts), \",,\" (0 parts after empties removed), or \"a,b,c\". Passing a multi-token or empty string to the converter.","commonSituations":"Typing a wrong format in XAML (e.g. ContentLayout=\"Left,10,Extra\"). Building the layout string programmatically with an unexpected number of segments. Localization inserting extra commas.","solutions":["Use exactly one position keyword (Left/Right/Top/Bottom/Default) or a keyword plus one numeric spacing.","Validate the split count equals 1 or 2 before assigning.","Refer to the documented format: position first or spacing first, separated by a single comma."],"exampleFix":"// before\n<Button ContentLayout=\"Left,10,Right\" />\n\n// after\n<Button ContentLayout=\"Left,10\" />","handlingStrategy":"validation","validationCode":"static bool IsValidLayoutString(string s)\n{\n    var parts = s.Split(',', StringSplitOptions.RemoveEmptyEntries);\n    return parts.Length == 1 || parts.Length == 2;\n}\nif (!IsValidLayoutString(input)) throw new ArgumentException(\"Expected 1 or 2 parts\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use the documented format: position keyword, optionally followed by a numeric spacing.","Validate split count before assigning.","Avoid extra commas from localization/formatting."],"tags":["maui","button","type-converter","xaml","format"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}