dotnet/wpf · error · InvalidEnumArgumentException

InvalidEnumArgumentException(nameof(format), (int)format…

Error message

InvalidEnumArgumentException(nameof(format), (int)format, typeof(TextDataFormat))

What it means

DataObject.ContainsText(TextDataFormat) validates its argument before use. If the format value is not one of the valid text formats (Text, UnicodeText, Rtf, Html, Xaml) — i.e. DataFormats.IsValidTextDataFormat returns false — it throws InvalidEnumArgumentException naming the 'format' parameter, its integer value, and the TextDataFormat type. This prevents invalid enum values (often raw casts of ints) from silently corrupting clipboard data lookups.

Solutions

  1. Pass an explicitly named TextDataFormat member (Text, UnicodeText, Rtf, Html, Xaml) instead of a cast integer.
  2. Validate the value first with DataFormats.IsValidTextDataFormat(format) before calling ContainsText.
  3. If the value originates from an int, check Enum.IsDefined(typeof(TextDataFormat), value) and that it is one of the text formats before casting.
  4. Replace free-form int storage of the format with the TextDataFormat-typed value throughout the app.

Example fix

// before
var fmt = (TextDataFormat)storedInt;
bool hasText = data.ContainsText(fmt);
// after
var fmt = (TextDataFormat)storedInt;
if (!DataFormats.IsValidTextDataFormat(fmt))
    fmt = TextDataFormat.Text;
bool hasText = data.ContainsText(fmt);
Defensive patterns

Strategy: validation

Validate before calling

bool canQuery = Enum.IsDefined(typeof(TextDataFormat), format) && DataFormats.IsValidTextDataFormat(format);
if (!canQuery) format = TextDataFormat.Text;
bool result = dataObject.ContainsText(format);

Type guard

static bool IsValidTextFormat(TextDataFormat f) => DataFormats.IsValidTextDataFormat(f);

Try / catch

try { return dataObject.ContainsText(format); }
catch (InvalidEnumArgumentException ex) { log.Warn(ex.Message); return false; }

Prevention

When it happens

Trigger: Calling ContainsText(TextDataFormat) with a value outside TextDataFormat.Text|UnicodeText|Rtf|Html|Xaml, e.g. ((TextDataFormat)0) (default enum value 0 is not defined), a cast of an arbitrary int, or TextDataFormat.CommaSeparatedValue/Bitmap/Serializable which are not text formats.

Common situations: Persisting the format as an int in settings or config and casting it back without validation; passing TextDataFormat default(=0); wiring UI combo boxes to all TextDataFormat values including non-text ones; interop code receiving an integer clipboard format and casting it blindly.

Understand the failure class

Background: "invalid argument", "unknown mode", "not supported": invalid enum-like argument errors explained — this error's family across 19 libraries.

Related errors


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

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/dataobject.cs:287

    /// <summary>
    ///  Return <see langword="true"/> if DataObject contains the image data. Otherwise, return <see langword="false"/>.
    /// </summary>
    public bool ContainsImage() => GetDataPresent(DataFormats.Bitmap, autoConvert: false);

    /// <summary>
    ///  Return <see langword="true"/> if DataObject contains the text data. Otherwise, return <see langword="false"/>.
    /// </summary>
    public bool ContainsText() => ContainsText(TextDataFormat.UnicodeText);

    /// <summary>
    ///  Return <see langword="true"/> if DataObject contains the specified text data. Otherwise, return <see langword="false"/>.
    /// </summary>
    public bool ContainsText(TextDataFormat format)
    {
        if (!DataFormats.IsValidTextDataFormat(format))
        {
            throw new InvalidEnumArgumentException(nameof(format), (int)format, typeof(TextDataFormat));
        }

        return GetDataPresent(DataFormats.ConvertToDataFormats(format), autoConvert: false);
    }

    /// <summary>
    ///  Get audio data as Stream.
    /// </summary>
    public Stream? GetAudioStream() => GetData(DataFormats.WaveAudio, autoConvert: false) as Stream;

    /// <summary>
    ///  Get file drop list data as Stream.
    /// </summary>
    public StringCollection GetFileDropList()
    {
        StringCollection dropList = [];
        if (GetData(DataFormatNames.FileDrop, autoConvert: true) is string[] strings)
        {

View on GitHub (pinned to 81131a70a4)