{"record":{"id":"5f37c32656ae6f5f","repo":"dotnet/wpf","slug":"sr-typemetadatacannotchangeafteruse-propertymetadata","errorCode":null,"errorMessage":"SR.TypeMetadataCannotChangeAfterUse","messagePattern":"SR\\.TypeMetadataCannotChangeAfterUse","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/PropertyMetadata.cs","lineNumber":92,"sourceCode":"        public object DefaultValue\n        {\n            get\n            {\n                if (_defaultValue is not DefaultValueFactory defaultFactory)\n                {\n                    return _defaultValue;\n                }\n                else\n                {\n                    return defaultFactory.DefaultValue;\n                }\n            }\n\n            set\n            {\n                if (Sealed)\n                {\n                    throw new InvalidOperationException(SR.TypeMetadataCannotChangeAfterUse);\n                }\n\n                if (value == DependencyProperty.UnsetValue)\n                {\n                    throw new ArgumentException(SR.DefaultValueMayNotBeUnset);\n                }\n\n                _defaultValue = value;\n\n                SetModified(MetadataFlags.DefaultValueModifiedID);\n            }\n        }\n\n\n        /// <summary>\n        ///     Returns true if the default value is a DefaultValueFactory\n        /// </summary>\n        internal bool UsingDefaultValueFactory","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/PropertyMetadata.cs#L74-L110","documentation":"PropertyMetadata.DefaultValue's setter throws InvalidOperationException when the metadata instance is Sealed, i.e. it has already been used to register a dependency property or otherwise sealed by the WPF property system. Metadata is frozen after first use so all registered properties share consistent behavior.","triggerScenarios":"Setting DefaultValue on a PropertyMetadata instance after it was passed to DependencyProperty.Register/RegisterAttached/RegisterReadOnly (or after Merge sealed it), typically via a shared/static metadata object.","commonSituations":"Reusing one static PropertyMetadata across multiple dependency properties and then mutating it; overriding defaults at runtime for a property that was already registered; framework code sealing metadata during app startup while later code mutates it.","solutions":["Create a new PropertyMetadata instance with the desired DefaultValue instead of mutating the sealed one.","Use DependencyProperty.AddOwner or OverrideMetadata to supply new metadata for a derived type rather than editing existing metadata.","Set DefaultValue in the constructor before any Register call, and keep metadata instances private per property.","Check the Sealed property before mutating and branch to a fresh instance."],"exampleFix":"// before\nMyControl.ValueProperty.OverrideMetadata(typeof(MyControl), sharedMetadata);\nsharedMetadata.DefaultValue = 42; // InvalidOperationException if sharedMetadata is sealed\n\n// after\nMyControl.ValueProperty.OverrideMetadata(typeof(MyControl),\n    new PropertyMetadata { DefaultValue = 42 });","handlingStrategy":"validation","validationCode":"if (metadata.Sealed)\n    metadata = new PropertyMetadata { DefaultValue = newDefault };\nelse\n    metadata.DefaultValue = newDefault;","typeGuard":null,"tryCatchPattern":"try\n{\n    metadata.DefaultValue = newDefault;\n}\ncatch (InvalidOperationException)\n{\n    // metadata already registered; use OverrideMetadata with a new instance instead\n}","preventionTips":["Treat PropertyMetadata instances as immutable after passing them to Register/OverrideMetadata.","Never share one static metadata instance across properties you plan to customize individually.","Set DefaultValue only via the constructor at creation time."],"tags":["wpf","dependency-properties","metadata","invalid-operation"],"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-22T01:17:13.364Z"}