{"record":{"id":"65073afdd9f84c39","repo":"dotnet/wpf","slug":"can-t-assign-to-known-member-attributes","errorCode":null,"errorMessage":"Can't Assign to Known Member attributes","messagePattern":"Can't Assign to Known Member attributes","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Markup/Baml2006/WpfKnownMember.cs","lineNumber":103,"sourceCode":"            _type = type;\n            ReadOnly = isReadOnly;\n        }\n\n        protected override bool LookupIsUnknown()\n        {\n            return false;\n        }\n\n        public void Freeze()\n        {\n            Frozen = true;\n        }\n\n        private void CheckFrozen()\n        {\n            if (Frozen)\n            {\n                throw new InvalidOperationException(\"Can't Assign to Known Member attributes\");\n            }\n        }\n\n        protected override System.Xaml.Schema.XamlMemberInvoker LookupInvoker()\n        {\n            return new WpfKnownMemberInvoker(this);\n        }\n\n        public Action<object, object> SetDelegate\n        {\n            get\n            {\n                return _setDelegate;\n            }\n            set\n            {\n                CheckFrozen();\n                _setDelegate = value;","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Markup/Baml2006/WpfKnownMember.cs#L85-L121","documentation":"WpfKnownMember metadata objects become frozen after initialization; CheckFrozen throws InvalidOperationException \"Can't Assign to Known Member attributes\" when any property setter (ReadOnly, HasSpecialTypeConverter, Ambient, IsReadPrivate, IsWritePrivate, SetDelegate) is invoked on a frozen member. Known-member tables are immutable by design once the schema is sealed.","triggerScenarios":"Attempting to mutate a WpfKnownMember (e.g. setting a delegate or type-converter flag) after the WPF known-types table froze it — typically during or after schema lookup, or from custom XAML schema code touching cached members.","commonSituations":"Custom XamlSchemaContext / type-mapping code writing to known members at load time instead of during table construction; reflection-based tools trying to patch WPF member metadata; re-initializing shared schema members across AppDomain reloads.","solutions":["Set all member attributes during construction/table-building, before the member is frozen (before it is handed to the schema/lookup pipeline).","Don't mutate cached WpfKnownMember instances — create your own XamlMember subclass with the desired overrides instead.","If you need per-case behavior, wrap the member with a custom XamlMember that overrides LookupIsReadOnly/LookupTypeConverter etc.","Check for double initialization of the known-types table in your hosting code."],"exampleFix":"// before\nvar member = (WpfKnownMember)context.GetXamlMember(prop, schemaCtx); // already frozen\nmember.IsReadPrivate = true; // throws\n// after\nclass MyMember : XamlMember { protected override bool LookupIsReadPrivate() => true; }\nvar member = new MyMember(prop, schemaCtx);","handlingStrategy":"type-guard","validationCode":"// Guard against mutating frozen known members\nif (member is WpfKnownMember { Frozen: true })\n    throw new InvalidOperationException(\"Known member is frozen; override via a custom XamlMember instead.\");","typeGuard":"static bool IsMutableMember(System.Xaml.XamlMember m) => m is not WpfKnownMember { Frozen: true };","tryCatchPattern":"try\n{\n    ConfigureMember(knownMember);\n}\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"Can't Assign to Known Member\"))\n{\n    // wrap with a custom XamlMember overriding the desired lookup instead of mutating\n    throw new NotSupportedException(\"Create a derived XamlMember with overridden Lookup* methods.\", ex);\n}","preventionTips":["Configure member attributes during table construction, before freezing","Prefer subclassing XamlMember over mutating cached WPF members","Avoid reflection-based patching of WPF schema metadata","Initialize known-type tables once per AppDomain to avoid re-init races"],"tags":["wpf","xaml","schema","immutable-state"],"backgroundTag":"invalid-state-transition","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"}