{"record":{"id":"3bf676aa73062f93","repo":"dotnet/wpf","slug":"invalidenumargumentexception-defaultupdatesourcetrigger-int","errorCode":null,"errorMessage":"InvalidEnumArgumentException(\"defaultUpdateSourceTrigger\", (int) defaultUpdateSourceTrigger, typeof(UpdateSourceTrigger))","messagePattern":"InvalidEnumArgumentException\\(\"defaultUpdateSourceTrigger\", \\(int\\) defaultUpdateSourceTrigger, typeof\\(UpdateSourceTrigger\\)\\)","errorType":"exception","errorClass":"InvalidEnumArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkPropertyMetadata.cs","lineNumber":222,"sourceCode":"        ///     Framework type metadata construction.  Marked as no inline to reduce code size.\n        /// </summary>\n        /// <param name=\"defaultValue\">Default value of property</param>\n        /// <param name=\"flags\">Metadata option flags</param>\n        /// <param name=\"propertyChangedCallback\">Called when the property has been changed</param>\n        /// <param name=\"coerceValueCallback\">Called on update of value</param>\n        /// <param name=\"isAnimationProhibited\">Should animation of this property be prohibited?</param>\n        /// <param name=\"defaultUpdateSourceTrigger\">The UpdateSourceTrigger to use for bindings that have UpdateSourceTriger=Default.</param>\n        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]\n        public FrameworkPropertyMetadata(object defaultValue,\n                                         FrameworkPropertyMetadataOptions flags,\n                                         PropertyChangedCallback propertyChangedCallback,\n                                         CoerceValueCallback coerceValueCallback,\n                                         bool isAnimationProhibited,\n                                         UpdateSourceTrigger defaultUpdateSourceTrigger) :\n            base(defaultValue, propertyChangedCallback, coerceValueCallback, isAnimationProhibited)\n        {\n            if (!BindingOperations.IsValidUpdateSourceTrigger(defaultUpdateSourceTrigger))\n                throw new InvalidEnumArgumentException(\"defaultUpdateSourceTrigger\", (int) defaultUpdateSourceTrigger, typeof(UpdateSourceTrigger));\n            if (defaultUpdateSourceTrigger == UpdateSourceTrigger.Default)\n                throw new ArgumentException(SR.NoDefaultUpdateSourceTrigger, nameof(defaultUpdateSourceTrigger));\n\n            TranslateFlags(flags);\n            DefaultUpdateSourceTrigger = defaultUpdateSourceTrigger;\n        }\n\n        private void Initialize()\n        {\n            // FW_DefaultUpdateSourceTriggerEnumBit1        = 0x40000000,\n            // FW_DefaultUpdateSourceTriggerEnumBit2        = 0x80000000,\n            _flags = (MetadataFlags)(((uint)_flags & 0x3FFFFFFF) | ((uint) UpdateSourceTrigger.PropertyChanged) << 30);\n        }\n        \n        private static bool IsFlagSet(FrameworkPropertyMetadataOptions flag, FrameworkPropertyMetadataOptions flags)\n        {\n            return (flags & flag) != 0;\n        }","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkPropertyMetadata.cs#L204-L240","documentation":"The FrameworkPropertyMetadata constructor accepting an UpdateSourceTrigger validates the argument: if the value is not one of the defined UpdateSourceTrigger members (per BindingOperations.IsValidUpdateSourceTrigger), an InvalidEnumArgumentException is thrown. This prevents invalid casted integers from masquerading as enum values and poisoning metadata.","triggerScenarios":"Calling the FrameworkPropertyMetadata constructor with a defaultUpdateSourceTrigger value outside the UpdateSourceTrigger enum — typically an invalid int cast to UpdateSourceTrigger, or an undefined enum member — when registering a dependency property.","commonSituations":"Storing the trigger as an int/byte in config or data-binding layers and casting without validating; deserializing an enum value from XML/JSON that contains an out-of-range number; SDK version differences where enum members changed.","solutions":["Pass a defined enum member: UpdateSourceTrigger.PropertyChanged, LostFocus, or Explicit — but note UpdateSourceTrigger.Default is also rejected here (use a concrete trigger).","Validate with BindingOperations.IsValidUpdateSourceTrigger(value) before calling the constructor.","If the value comes from external data, parse it safely with Enum.TryParse<UpdateSourceTrigger> and fall back to a valid default."],"exampleFix":"// before\nvar trigger = (UpdateSourceTrigger)42;\nvar meta = new FrameworkPropertyMetadata(null, ..., trigger);\n// after\nif (BindingOperations.IsValidUpdateSourceTrigger(rawValue)) {\n    var meta = new FrameworkPropertyMetadata(null, ..., rawValue); // e.g. UpdateSourceTrigger.PropertyChanged\n}","handlingStrategy":"validation","validationCode":"UpdateSourceTrigger t;\nbool ok = Enum.TryParse(rawValue.ToString(), out t) && BindingOperations.IsValidUpdateSourceTrigger(t) && t != UpdateSourceTrigger.Default;","typeGuard":"bool IsValidTrigger(object v) => v is UpdateSourceTrigger u && BindingOperations.IsValidUpdateSourceTrigger(u) && u != UpdateSourceTrigger.Default;","tryCatchPattern":"try { var meta = new FrameworkPropertyMetadata(null, null, null, false, trigger); } catch (InvalidEnumArgumentException) { trigger = UpdateSourceTrigger.PropertyChanged; }","preventionTips":["Never cast raw ints to UpdateSourceTrigger without IsValidUpdateSourceTrigger","Use Enum.TryParse for enum values from config/deserialization","Remember UpdateSourceTrigger.Default is rejected here — pass a concrete trigger"],"tags":["wpf","enum","argument-validation","invalid-enum-value"],"backgroundTag":"invalid-enum-value","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"}