dotnet/wpf · error · InvalidEnumArgumentException

InvalidEnumArgumentException("value", (int) value…

Error message

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

What it means

The Binding.UpdateSourceTrigger setter maps the UpdateSourceTrigger value via FlagsFrom; an unrecognized value yields BindingFlags.IllegalInput and throws InvalidEnumArgumentException for parameter 'value'. Only PropertyChanged, LostFocus, Explicit, and Default are accepted.

Solutions

  1. Assign only valid UpdateSourceTrigger members (Default, PropertyChanged, LostFocus, Explicit).
  2. Guard with Enum.IsDefined(typeof(UpdateSourceTrigger), value) before assignment.
  3. Fall back to UpdateSourceTrigger.Default for unknown persisted values.

Example fix

// before
binding.UpdateSourceTrigger = (UpdateSourceTrigger)stored;
// after
binding.UpdateSourceTrigger = Enum.IsDefined(typeof(UpdateSourceTrigger), stored) ? (UpdateSourceTrigger)stored : UpdateSourceTrigger.Default;
Defensive patterns

Strategy: validation

Validate before calling

if (!Enum.IsDefined(typeof(UpdateSourceTrigger), value))
    throw new InvalidEnumArgumentException(nameof(value), (int)value, typeof(UpdateSourceTrigger));
binding.UpdateSourceTrigger = (UpdateSourceTrigger)value;

Type guard

static bool IsValidTrigger(int v) => Enum.IsDefined(typeof(UpdateSourceTrigger), v);

Try / catch

try { binding.UpdateSourceTrigger = (UpdateSourceTrigger)stored; } catch (InvalidEnumArgumentException) { binding.UpdateSourceTrigger = UpdateSourceTrigger.Default; }

Prevention

When it happens

Trigger: binding.UpdateSourceTrigger = (UpdateSourceTrigger)42; ints deserialized from config cast unchecked into the enum; code generators emitting wrong enum constants.

Common situations: Round-tripping binding definitions through settings or serialization; dynamic UI builders driven by user-selected numeric values.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/Binding.cs:391

            get
            {
                switch (GetFlagsWithinMask(BindingFlags.UpdateMask))
                {
                    case BindingFlags.UpdateOnPropertyChanged: return UpdateSourceTrigger.PropertyChanged;
                    case BindingFlags.UpdateOnLostFocus:    return UpdateSourceTrigger.LostFocus;
                    case BindingFlags.UpdateExplicitly:     return UpdateSourceTrigger.Explicit;
                    case BindingFlags.UpdateDefault:        return UpdateSourceTrigger.Default;
                }
                Invariant.Assert(false, "Unexpected UpdateSourceTrigger value");
                return 0;
            }
            set
            {
                CheckSealed();

                BindingFlags flags = FlagsFrom(value);
                if (flags == BindingFlags.IllegalInput)
                    throw new InvalidEnumArgumentException("value", (int) value, typeof(UpdateSourceTrigger));

                ChangeFlagsWithinMask(BindingFlags.UpdateMask, flags);
            }
        }

        /// <summary> Raise SourceUpdated event whenever a value flows from target to source </summary>
        [DefaultValue(false)]
        public bool NotifyOnSourceUpdated
        {
            get
            {
                return TestFlag(BindingFlags.NotifyOnSourceUpdated);
            }
            set
            {
                bool currentValue = TestFlag(BindingFlags.NotifyOnSourceUpdated);
                if (currentValue != value)
                {

View on GitHub (pinned to 81131a70a4)