PrismLibrary/Prism · error · InvalidOperationException

Resources.HostControlCannotBeSetAfterAttach

Error message

Resources.HostControlCannotBeSetAfterAttach

What it means

SyncRegionContextWithHostBehavior.HostControl setter throws InvalidOperationException with Resources.HostControlCannotBeSetAfterAttach when the behavior has already been attached. Like the other region behaviors, the host control must be fixed before attach because the behavior wires context synchronization to it at attach time.

Solutions

  1. Assign HostControl before calling Attach().
  2. Create a new SyncRegionContextWithHostBehavior instance for a different host instead of reassigning.
  3. Audit any custom region/behavior setup code for property-assignment order.
  4. Do not data-bind HostControl to values that change after region attach.

Example fix

// before
syncBehavior.Attach();
syncBehavior.HostControl = host; // throws
// after
syncBehavior.HostControl = host;
syncBehavior.Attach();
Defensive patterns

Strategy: validation

Validate before calling

if (syncBehavior.IsAttached)
    throw new InvalidOperationException("Set HostControl before Attach().");

Type guard

bool CanAssignHost(SyncRegionContextWithHostBehavior b) => !b.IsAttached;

Try / catch

try
{
    syncBehavior.HostControl = host;
}
catch (InvalidOperationException)
{
    syncBehavior = new SyncRegionContextWithHostBehavior { HostControl = host };
    syncBehavior.Attach();
}

Prevention

When it happens

Trigger: Assigning behavior.HostControl after behavior.Attach() — via custom region bootstrap code, resolved behavior instances, or template re-application that triggers the setter post-attach.

Common situations: Programmatic region construction where property assignment order is wrong; refactoring that moved Attach earlier; unit tests that mutate behaviors after attach.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of PrismLibrary/Prism@358118cd64 (2026-09-15). Data as JSON: /api/errors/9eaf49d2835fcb24. Report an issue: GitHub.

Appendix: source

Thrown at src/Wpf/Prism.Wpf/Navigation/Regions/Behaviors/SyncRegionContextWithHostBehavior.cs:48

        /// <summary>
        /// Gets or sets the <see cref="DependencyObject"/> that the <see cref="IRegion"/> is attached to.
        /// </summary>
        /// <value>
        /// A <see cref="DependencyObject"/> that the <see cref="IRegion"/> is attached to.
        /// This is usually a <see cref="FrameworkElement"/> that is part of the tree.
        /// </value>
        public DependencyObject HostControl
        {
            get
            {
                return _hostControl;
            }
            set
            {
                if (IsAttached)
                {
                    throw new InvalidOperationException(Resources.HostControlCannotBeSetAfterAttach);
                }

                _hostControl = value;
            }
        }

        /// <summary>
        /// Override this method to perform the logic after the behavior has been attached.
        /// </summary>
        protected override void OnAttach()
        {
            if (HostControl != null)
            {
                // Sync values initially.
                SynchronizeRegionContext();

                // Now register for events to keep them in sync
                HostControlRegionContext.PropertyChanged += RegionContextObservableObject_PropertyChanged;

View on GitHub (pinned to 358118cd64)