{"record":{"id":"d73f5b8756dd5fee","repo":"dotnet/wpf","slug":"xamlxmlwriterexception-sr-format-sr","errorCode":null,"errorMessage":"XamlXmlWriterException(SR.Format(SR.XamlXmlWriterDuplicateMember, property.Name))","messagePattern":"XamlXmlWriterException\\(SR\\.Format\\(SR\\.XamlXmlWriterDuplicateMember, property\\.Name\\)\\)","errorType":"exception","errorClass":"XamlXmlWriterException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlXmlWriter.cs","lineNumber":515,"sourceCode":"                Frame objectFrame = namespaceScopes.Peek();\n                if (objectFrame.AllocatingNodeType != XamlNodeType.StartObject &&\n                    objectFrame.AllocatingNodeType != XamlNodeType.GetObject)\n                {\n                    Frame temp = namespaceScopes.Pop();\n                    objectFrame = namespaceScopes.Peek();\n                    namespaceScopes.Push(temp);\n                }\n\n                Debug.Assert(objectFrame.AllocatingNodeType == XamlNodeType.StartObject ||\n                             objectFrame.AllocatingNodeType == XamlNodeType.GetObject);\n\n                if (objectFrame.Members is null)\n                {\n                    objectFrame.Members = new XamlPropertySet();\n                }\n                else if (objectFrame.Members.Contains(property))\n                {\n                    throw new XamlXmlWriterException(SR.Format(SR.XamlXmlWriterDuplicateMember, property.Name));\n                }\n\n                objectFrame.Members.Add(property);\n            }\n        }\n\n        private void WriteDeferredNamespaces(XamlNodeType nodeType)\n        {\n            Frame frame = namespaceScopes.Peek();\n            if (frame.AllocatingNodeType != nodeType)\n            {\n                Frame temp = namespaceScopes.Pop();\n                frame = namespaceScopes.Peek();\n                Debug.Assert(frame.AllocatingNodeType == nodeType);\n                namespaceScopes.Push(temp);\n            }\n\n            var prefixMap = frame.GetSortedPrefixMap();","sourceCodeStart":497,"sourceCodeEnd":533,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlXmlWriter.cs#L497-L533","documentation":"Within a single object element, each XAML member (property) may be written at most once. CheckMemberForUniqueness tracks written members per object frame and throws XamlXmlWriterException when WriteStartMember is called twice for the same property on the same object, which would produce invalid XML (duplicate attributes/elements).","triggerScenarios":"Calling WriteStartMember twice with the same XamlMember on the current object without an intervening WriteEndMember, e.g. writing a property via both a property element and again via its content/attachment path.","commonSituations":"Hand-built XAML node loops that iterate properties without deduplication; transform code that merges two node streams and emits the same property twice; wrappers that write a property plus a generated duplicate (e.g. both _Items and the typed property).","solutions":["Track members already written for the current object and skip duplicates","Deduplicate the property list before the write loop (e.g. via Distinct on XamlMember)","Fix node-stream transformation logic so each member is emitted exactly once per object"],"exampleFix":"// before\nforeach (var m in members) { writer.WriteStartMember(m); WriteMemberValue(m); writer.WriteEndMember(); }\n// after\nforeach (var m in members.Distinct()) { writer.WriteStartMember(m); WriteMemberValue(m); writer.WriteEndMember(); }","handlingStrategy":"validation","validationCode":"var seen = new HashSet<XamlMember>();\nif (!seen.Add(member)) return; // duplicate member for current object; skip","typeGuard":null,"tryCatchPattern":"try { writer.WriteStartMember(member); }\ncatch (XamlXmlWriterException) { /* duplicate member; skip or fail with context */ }","preventionTips":["Deduplicate member lists before writing","Don't write the same property via multiple paths (element and generated content)","Assert one StartMember per member per object in your emitter"],"tags":["xaml","duplicate-member","node-stream"],"backgroundTag":"schema-validation-failed","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}