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
- Pass a concrete trigger such as UpdateSourceTrigger.PropertyChanged or UpdateSourceTrigger.LostFocus instead of UpdateSourceTrigger.Default.
- If you want the framework default behavior, use a constructor overload without the defaultUpdateSourceTrigger parameter.
- 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
- Never pass UpdateSourceTrigger.Default explicitly to FrameworkPropertyMetadata constructors.
- Use constructor overloads without the trigger parameter when framework defaults are desired.
- Centralize dependency-property metadata construction in one helper that validates options.
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
- Animation_ChildMustBeKeyFrame
- Animation_DependencyPropertyIsNotAnimatable
- Animation_UnrecognizedHandoffBehavior
- InvalidEnumArgumentException for value (TextTrimming)
- InvalidEnumArgumentException("mode", (int)mode…
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)