{"record":{"id":"3d413cb8977739f9","repo":"AvaloniaUI/Avalonia","slug":"too-many-arguments-in-relativesource-syntax-sugar","errorCode":null,"errorMessage":"Too many arguments in RelativeSource syntax sugar","messagePattern":"Too many arguments in RelativeSource syntax sugar","errorType":"validation","errorClass":"ExpressionParseException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Data/Core/Parsers/BindingExpressionGrammar.cs","lineNumber":335,"sourceCode":"        private static State ParseRelativeSource(ref CharacterReader r, List<INode> nodes)\n        {\n            var mode = r.ParseIdentifier();\n\n            if (mode.SequenceEqual(\"self\".AsSpan()))\n            {\n                nodes.Add(new SelfNode());\n            }\n            else if (mode.SequenceEqual(\"parent\".AsSpan()))\n            {\n                string? ancestorNamespace = null;\n                string? ancestorType = null;\n                var ancestorLevel = 0;\n                if (PeekOpenBracket(ref r))\n                {\n                    var args = r.ParseArguments('[', ']', ';');\n                    if (args.Count > 2 || args.Count == 0)\n                    {\n                        throw new ExpressionParseException(r.Position, \"Too many arguments in RelativeSource syntax sugar\");\n                    }\n                    else if (args.Count == 1)\n                    {\n                        if (int.TryParse(args[0], out int level))\n                        {\n                            ancestorType = null;\n                            ancestorLevel = level;\n                        }\n                        else\n                        {\n                            var reader = new CharacterReader(args[0].AsSpan());\n                            (ancestorNamespace, ancestorType) = ParseTypeName(ref reader);\n                        }\n                    }\n                    else\n                    {\n                        var reader = new CharacterReader(args[0].AsSpan());\n                        (ancestorNamespace, ancestorType) = ParseTypeName(ref reader);","sourceCodeStart":317,"sourceCodeEnd":353,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Data/Core/Parsers/BindingExpressionGrammar.cs#L317-L353","documentation":"Thrown by ParseRelativeSource when parsing the '$parent[...]' syntax sugar and ParseArguments returns a count that is 0 or greater than 2. The ancestor syntax supports at most two bracketed arguments: an optional type name and an optional ancestor level (as '$parent[Type;level]', '$parent[Type]', or '$parent[level]'). Zero arguments (empty brackets) or three or more are invalid.","triggerScenarios":"Writing '$parent[]' (zero arguments) or '$parent[Type;level;extra]' (three arguments separated by ';'). ParseArguments with delimiter ';' splits the bracket content; if the result has more than 2 elements or none at all, this error fires.","commonSituations":"Attempting to pass additional parameters to the ancestor finder; misunderstanding the RelativeSource syntax and using commas instead of semicolons (commas are the default delimiter, but this overload uses ';'); empty brackets from a template that conditionally inserts ancestor arguments but produces an empty string.","solutions":["Use at most two arguments inside '$parent[...]': either '$parent[Type]', '$parent[3]' (level), or '$parent[Type;3]' (both).","Separate arguments with ';' not ','.","If no arguments are needed, use '$parent' without brackets."],"exampleFix":"<!-- before: too many arguments -->\n{Binding $parent[Panel;2;extra]}\n\n<!-- after: correct argument count -->\n{Binding $parent[Panel;2]}","handlingStrategy":"validation","validationCode":"// Validate $parent bracket argument count (1 or 2, separated by ';')\nstatic void ValidateRelativeSourceArgs(string path)\n{\n    var match = System.Text.RegularExpressions.Regex.Match(path, @\"\\$parent\\[([^\\]]*)\\]\");\n    if (match.Success)\n    {\n        var args = match.Groups[1].Value.Split(';');\n        if (args.Length == 0 || args.Length > 2 || string.IsNullOrEmpty(match.Groups[1].Value))\n            throw new ArgumentException(\n                \"$parent[...] must have 1 or 2 arguments separated by ';'\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    var binding = new Binding(path);\n}\ncatch (ExpressionParseException ex) when (ex.Message.Contains(\"Too many arguments\"))\n{\n    logger.LogError($\"Too many arguments in $parent[...] at column {ex.Column}: use at most Type;level\");\n}","preventionTips":["Remember $parent supports at most two bracket args: a type name and/or an integer level.","Use ';' as the delimiter inside brackets, not ','.","For simple ancestor-by-type, use '$parent[Type]' without a level."],"tags":["avalonia","binding","xaml","binding-expression","relative-source","parser","syntax-error"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}