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
- Pass an explicitly named TextDataFormat member (Text, UnicodeText, Rtf, Html, Xaml) instead of a cast integer.
- Validate the value first with DataFormats.IsValidTextDataFormat(format) before calling ContainsText.
- If the value originates from an int, check Enum.IsDefined(typeof(TextDataFormat), value) and that it is one of the text formats before casting.
- 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
- Never cast raw ints to TextDataFormat without Enum.IsDefined plus an IsValidTextDataFormat check.
- Store formats as TextDataFormat values, not ints, in config/settings.
- Restrict UI format pickers to the five valid text formats.
- Watch out for default(TextDataFormat) == 0, which is undefined for this enum.
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
- InvalidEnumArgumentException("defaultUpdateSourceTrigger"…
- SR.DataObject_EmptyFormatNotAllowed
- SR.DataObject_EmptyFormatNotAllowed
- value
- ' ' is not a valid value for ' '.
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)