dotnet/wpf · error · InvalidEnumArgumentException

InvalidEnumArgumentException("value", (int) value…

Error message

InvalidEnumArgumentException("value", (int) value, typeof(UpdateSourceTrigger))

What it means

The DefaultUpdateSourceTrigger setter validates the assigned value with BindingOperations.IsValidUpdateSourceTrigger and throws InvalidEnumArgumentException when the value is not a defined UpdateSourceTrigger member. WPF stores the trigger in two flag bits, so only valid enum values are accepted.

Solutions

  1. Assign only named enum members: UpdateSourceTrigger.Default, PropertyChanged, LostFocus, Explicit.
  2. Validate the source value with Enum.IsDefined(typeof(UpdateSourceTrigger), value) before casting/assigning.
  3. If parsing from text, use Enum.TryParse<UpdateSourceTrigger> and reject failures.

Example fix

// before
metadata.DefaultUpdateSourceTrigger = (UpdateSourceTrigger)configValue; // throws if undefined
// after
if (Enum.IsDefined(typeof(UpdateSourceTrigger), configValue))
    metadata.DefaultUpdateSourceTrigger = (UpdateSourceTrigger)configValue;
Defensive patterns

Strategy: validation

Validate before calling

if (!Enum.IsDefined(typeof(UpdateSourceTrigger), rawValue))
    throw new ArgumentOutOfRangeException(nameof(rawValue));
metadata.DefaultUpdateSourceTrigger = (UpdateSourceTrigger)rawValue;

Type guard

bool IsValidTrigger(object v) => v is UpdateSourceTrigger t && Enum.IsDefined(typeof(UpdateSourceTrigger), t);

Try / catch

try { metadata.DefaultUpdateSourceTrigger = (UpdateSourceTrigger)raw; }
catch (InvalidEnumArgumentException ex) { log.Warn($"Bad trigger value {raw}"); }

Prevention

When it happens

Trigger: Assigning metadata.DefaultUpdateSourceTrigger = (UpdateSourceTrigger)someInt where someInt is not 0-3 (e.g. a cast raw value from config or interop).

Common situations: Casting integers read from config files or deserialized JSON into UpdateSourceTrigger; porting code where the enum gained members; arithmetic on enum values.

Understand the failure class

Background: "invalid argument", "unknown mode", "not supported": invalid enum-like argument errors explained — this error's family across 19 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/a84458a63d360111. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkPropertyMetadata.cs:481

            }
        }

        /// <summary>
        ///    The default UpdateSourceTrigger for two-way data bindings on this property.
        /// </summary>
        public UpdateSourceTrigger DefaultUpdateSourceTrigger
        {
            // FW_DefaultUpdateSourceTriggerEnumBit1        = 0x40000000,
            // FW_DefaultUpdateSourceTriggerEnumBit2        = 0x80000000,
            get { return (UpdateSourceTrigger) (((uint) _flags >> 30) & 0x3); }
            set
            {
                if (IsSealed)
                {
                    throw new InvalidOperationException(SR.TypeMetadataCannotChangeAfterUse);
                }
                if (!BindingOperations.IsValidUpdateSourceTrigger(value))
                    throw new InvalidEnumArgumentException("value", (int) value, typeof(UpdateSourceTrigger));
                if (value == UpdateSourceTrigger.Default)
                    throw new ArgumentException(SR.NoDefaultUpdateSourceTrigger, nameof(value));

                // FW_DefaultUpdateSourceTriggerEnumBit1        = 0x40000000,
                // FW_DefaultUpdateSourceTriggerEnumBit2        = 0x80000000,
                _flags = (MetadataFlags)(((uint) _flags & 0x3FFFFFFF) | ((uint) value) << 30);
                SetModified(MetadataFlags.FW_DefaultUpdateSourceTriggerModifiedID);
            }
        }


        /// <summary>
        ///     The value of this property should be saved/restored when journaling by URI
        /// </summary>
        public bool Journal
        {
            get { return ReadFlag(MetadataFlags.FW_ShouldBeJournaledID); }
            set

View on GitHub (pinned to 81131a70a4)