dotnet/wpf · error · InvalidOperationException
SR.NoUpdateSourceTriggerForInnerBindingOfMultiBinding
Error message
SR.NoUpdateSourceTriggerForInnerBindingOfMultiBinding
What it means
MultiBinding.CheckTrigger throws InvalidOperationException when an inner Binding of a MultiBinding uses an UpdateSourceTrigger other than PropertyChanged or Default. Inner bindings cannot use Explicit or LostFocus triggers because the MultiBinding controls updates as a whole.
Solutions
- Remove the UpdateSourceTrigger setting from inner bindings (use Default)
- Or set UpdateSourceTrigger="PropertyChanged" on each inner Binding
- Control update timing on the outer MultiBinding instead of the inner bindings
Example fix
<!-- before -->
<MultiBinding Converter="{StaticResource conv}">
<Binding Path="A" UpdateSourceTrigger="LostFocus"/>
</MultiBinding>
<!-- after -->
<MultiBinding Converter="{StaticResource conv}">
<Binding Path="A" UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding> Defensive patterns
Strategy: validation
Validate before calling
foreach (var b in multiBinding.Bindings.OfType<Binding>())
if (b.UpdateSourceTrigger != UpdateSourceTrigger.PropertyChanged && b.UpdateSourceTrigger != UpdateSourceTrigger.Default)
throw new InvalidOperationException("Inner bindings must use PropertyChanged or Default trigger"); Try / catch
try { BindingOperations.SetBinding(t, p, multiBinding); } catch (InvalidOperationException) { /* fix inner UpdateSourceTrigger */ } Prevention
- Never set Explicit/LostFocus triggers on MultiBinding inner bindings
- Control update timing via the outer MultiBinding/its own trigger semantics
- Audit copied bindings reused inside MultiBinding for leftover trigger settings
When it happens
Trigger: A child <Binding UpdateSourceTrigger="Explicit"/> or UpdateSourceTrigger="LostFocus" inside a MultiBinding, evaluated when the MultiBinding's binding expression is created (CreateBindingExpressionOverride calls CheckTrigger on each child).
Common situations: Copying a normal Binding with UpdateSourceTrigger="LostFocus" into a MultiBinding; setting Explicit on an inner binding to defer source updates; template reuse where the inner binding's trigger was configured for standalone use.
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
- SR.ChildHasWrongType (formatted with type name…
- SR.MultiBindingHasNoConverter
- SR.ValidationRule_UnknownStep (formatted with…
- " }} " element found. Expected fixed page element ( }} ).
- ' ' can only host a ' ' or a ' '. ' ' is an invalid…
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/c83e6d8d592a2e82.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/MultiBinding.cs:378
//------------------------------------------------------
internal object DoFilterException(object bindExpr, Exception exception)
{
UpdateSourceExceptionFilterCallback callback = (UpdateSourceExceptionFilterCallback)GetValue(Feature.ExceptionFilterCallback, null);
if (callback != null)
return callback(bindExpr, exception);
return exception;
}
internal static void CheckTrigger(BindingBase bb)
{
Binding binding = bb as Binding;
if (binding != null)
{
if (binding.UpdateSourceTrigger != UpdateSourceTrigger.PropertyChanged &&
binding.UpdateSourceTrigger != UpdateSourceTrigger.Default)
throw new InvalidOperationException(SR.NoUpdateSourceTriggerForInnerBindingOfMultiBinding);
}
}
internal override BindingBase CreateClone()
{
return new MultiBinding();
}
internal override void InitializeClone(BindingBase baseClone, BindingMode mode)
{
MultiBinding clone = (MultiBinding)baseClone;
CopyValue(Feature.Converter, clone);
CopyValue(Feature.ConverterParameter, clone);
CopyValue(Feature.Culture, clone);
CopyValue(Feature.ValidationRules, clone);
CopyValue(Feature.ExceptionFilterCallback, clone);
View on GitHub (pinned to 81131a70a4)