dotnet/wpf · error · ArgumentException

SR.NoDefaultUpdateSourceTrigger

Error message

SR.NoDefaultUpdateSourceTrigger

What it means

The FrameworkPropertyMetadata constructor throws ArgumentException when you pass UpdateSourceTrigger.Default as the defaultUpdateSourceTrigger. 'Default' is a sentinel meaning 'inherit from the metadata', so it is not a valid explicit default for a new metadata instance; the binding engine needs a concrete trigger (PropertyChanged, LostFocus, etc.). An InvalidEnumArgumentException is thrown first if the value is not a defined UpdateSourceTrigger at all.

Solutions

  1. Pass a concrete trigger such as UpdateSourceTrigger.PropertyChanged or UpdateSourceTrigger.LostFocus instead of UpdateSourceTrigger.Default.
  2. If you want the framework default behavior, use a constructor overload without the defaultUpdateSourceTrigger parameter.
  3. Validate the enum value before constructing: if (trigger == UpdateSourceTrigger.Default) throw/fix before calling.

Example fix

// before
var meta = new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnChanged, null, false, UpdateSourceTrigger.Default);
// after
var meta = new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnChanged, null, false, UpdateSourceTrigger.PropertyChanged);
Defensive patterns

Strategy: validation

Validate before calling

if (!Enum.IsDefined(typeof(UpdateSourceTrigger), trigger) || trigger == UpdateSourceTrigger.Default)
    throw new ArgumentOutOfRangeException(nameof(trigger), trigger, "Must be a concrete UpdateSourceTrigger (not Default).");

Type guard

static bool IsConcreteTrigger(UpdateSourceTrigger t) => t == UpdateSourceTrigger.PropertyChanged || t == UpdateSourceTrigger.LostFocus || t == UpdateSourceTrigger.Explicit;

Prevention

When it happens

Trigger: Calling any FrameworkPropertyMetadata constructor overload that accepts defaultUpdateSourceTrigger with UpdateSourceTrigger.Default, e.g. new FrameworkPropertyMetadata(value, flags, callback, coerce, false, UpdateSourceTrigger.Default).

Common situations: Developers copying a flags argument list and passing 'Default' thinking it means 'use the WPF default'; refactoring from PropertyMetadata to FrameworkPropertyMetadata while keeping a placeholder enum value; generating dependency property registrations with code templates that default enums to their 0 value (UpdateSourceTrigger.Default == 0).

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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

Appendix: source

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

        /// <param name="defaultValue">Default value of property</param>
        /// <param name="flags">Metadata option flags</param>
        /// <param name="propertyChangedCallback">Called when the property has been changed</param>
        /// <param name="coerceValueCallback">Called on update of value</param>
        /// <param name="isAnimationProhibited">Should animation of this property be prohibited?</param>
        /// <param name="defaultUpdateSourceTrigger">The UpdateSourceTrigger to use for bindings that have UpdateSourceTriger=Default.</param>
        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
        public FrameworkPropertyMetadata(object defaultValue,
                                         FrameworkPropertyMetadataOptions flags,
                                         PropertyChangedCallback propertyChangedCallback,
                                         CoerceValueCallback coerceValueCallback,
                                         bool isAnimationProhibited,
                                         UpdateSourceTrigger defaultUpdateSourceTrigger) :
            base(defaultValue, propertyChangedCallback, coerceValueCallback, isAnimationProhibited)
        {
            if (!BindingOperations.IsValidUpdateSourceTrigger(defaultUpdateSourceTrigger))
                throw new InvalidEnumArgumentException("defaultUpdateSourceTrigger", (int) defaultUpdateSourceTrigger, typeof(UpdateSourceTrigger));
            if (defaultUpdateSourceTrigger == UpdateSourceTrigger.Default)
                throw new ArgumentException(SR.NoDefaultUpdateSourceTrigger, nameof(defaultUpdateSourceTrigger));

            TranslateFlags(flags);
            DefaultUpdateSourceTrigger = defaultUpdateSourceTrigger;
        }

        private void Initialize()
        {
            // FW_DefaultUpdateSourceTriggerEnumBit1        = 0x40000000,
            // FW_DefaultUpdateSourceTriggerEnumBit2        = 0x80000000,
            _flags = (MetadataFlags)(((uint)_flags & 0x3FFFFFFF) | ((uint) UpdateSourceTrigger.PropertyChanged) << 30);
        }
        
        private static bool IsFlagSet(FrameworkPropertyMetadataOptions flag, FrameworkPropertyMetadataOptions flags)
        {
            return (flags & flag) != 0;
        }

        private void TranslateFlags(FrameworkPropertyMetadataOptions flags)

View on GitHub (pinned to 81131a70a4)