dotnet/wpf · error · ArgumentException

Data space transform stack includes undefined transform…

Error message

Data space transform stack includes undefined transform labels.

What it means

DataSpaceManager.DefineDataSpace validates that every transform label in the given transform stack has already been registered via DefineTransform. If any label in the stack is not a defined transform label, an ArgumentException with SR.TransformLabelUndefined is thrown and the data space is not created. This is a fail-fast guard so a data space never references a transform that has no registered TransformEnvironment/instance.

Solutions

  1. Register every transform first: call DefineTransform for each label before passing the stack to DefineDataSpace.
  2. Verify each label string matches exactly the label used in DefineTransform (watch for typos, trailing whitespace, null/empty entries).
  3. Reorder your code so transform registration happens before data space definition.
  4. Catch ArgumentException with message SR.TransformLabelUndefined and log which stack element is undefined before retrying with corrected labels.

Example fix

// before
manager.DefineDataSpace(new[] { "EncodedTransform" }, "MyDataSpace");
// after
if (!manager.TransformLabelIsDefined("EncodedTransform"))
    manager.DefineTransform("EncodedTransform", transformFactory);
manager.DefineDataSpace(new[] { "EncodedTransform" }, "MyDataSpace");
Defensive patterns

Strategy: validation

Validate before calling

string[] stack = GetTransformStack();
if (stack == null || stack.Any(l => string.IsNullOrEmpty(l) || !manager.TransformLabelIsDefined(l)))
    throw new InvalidOperationException("All transform labels must be defined via DefineTransform before DefineDataSpace.");

Prevention

When it happens

Trigger: Calling DefineDataSpace(string[] transformStack, string newDataSpaceLabel) (or the auto-named overload, which delegates to it) with an entry in transformStack that was never passed to DefineTransform, is misspelled, differs in casing beyond the comparison rules, is null, or is an empty string. Also thrown via SR.TransformLabelUndefined when a label was defined but its transform object was subsequently found unresolvable.

Common situations: Typo or casing mismatch between the label used in DefineTransform and in DefineDataSpace; defining the data space before registering its transforms; copying sample code that references transform labels from a different package; building the stack array dynamically and inserting a null/empty element.

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/6112b17063626c06. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/CompoundFile/DataSpaceManager.cs:598

        // Given label must be a non-empty string
        CU.CheckStringAgainstNullAndEmpty(newDataSpaceLabel, "newDataSpaceLabel");

        // Given label must not be a reserved string
        CU.CheckStringAgainstReservedName(newDataSpaceLabel, "newDataSpaceLabel");

        // Given label must not already be in use
        if( DataSpaceIsDefined( newDataSpaceLabel ) )
            throw new ArgumentException(
                SR.DataSpaceLabelInUse);

        // Given transform array must include labels that have already been defined
        foreach( string transformLabel in transformStack )
        {
            CU.CheckStringAgainstNullAndEmpty( transformLabel, "Transform label" );

            if( !TransformLabelIsDefined( transformLabel ) )
                throw new ArgumentException(
                    SR.TransformLabelUndefined);
        }

        // Passes all inspection, data space definition successful.
        SetDataSpaceDefinition( newDataSpaceLabel, new DataSpaceDefinition(new ArrayList(transformStack), null));
        _dirtyFlag = true;

        return;
    }

    /// <summary>
    /// Internal shortcut to check if data space is defined.  When we start
    /// doing on-demand reads of data space definitions, the "demand" could
    /// be triggered by this.
    /// </summary>
    /// <param name="dataSpaceLabel">Label to check</param>
    /// <returns>True if label is in use</returns>
    internal bool DataSpaceIsDefined( string dataSpaceLabel )

View on GitHub (pinned to 81131a70a4)