{"record":{"id":"c5199eea0d4f3348","repo":"AvaloniaUI/Avalonia","slug":"bindingvalue-has-no-value","errorCode":null,"errorMessage":"BindingValue has no value.","messagePattern":"BindingValue has no value\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Data/BindingValue.cs","lineNumber":129,"sourceCode":"        public bool HasError => Type.HasAllFlags(BindingValueType.HasError);\n\n        /// <summary>\n        /// Gets a value indicating whether the binding value has a value.\n        /// </summary>\n        public bool HasValue => Type.HasAllFlags(BindingValueType.HasValue);\n\n        /// <summary>\n        /// Gets the type of the binding value.\n        /// </summary>\n        public BindingValueType Type { get; }\n\n        /// <summary>\n        /// Gets the binding value or fallback value.\n        /// </summary>\n        /// <exception cref=\"InvalidOperationException\">\n        /// <see cref=\"HasValue\"/> is false.\n        /// </exception>\n        public T Value => HasValue ? _value! : throw new InvalidOperationException(\"BindingValue has no value.\");\n\n        /// <summary>\n        /// Gets the binding or data validation error.\n        /// </summary>\n        public Exception? Error { get; }\n\n        /// <summary>\n        /// Converts the binding value to an <see cref=\"Optional{T}\"/>.\n        /// </summary>\n        /// <returns></returns>\n        public Optional<T> ToOptional() => HasValue ? new Optional<T>(_value) : default;\n\n        /// <inheritdoc/>\n        public override string ToString() => HasError ? $\"Error: {Error!.Message}\" : _value?.ToString() ?? \"(null)\";\n\n        /// <summary>\n        /// Converts the value to untyped representation, using <see cref=\"AvaloniaProperty.UnsetValue\"/>,\n        /// <see cref=\"BindingOperations.DoNothing\"/> and <see cref=\"BindingNotification\"/> where","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Data/BindingValue.cs#L111-L147","documentation":"Thrown as InvalidOperationException by the BindingValue<T>.Value getter when HasValue is false. BindingValue<T> is a discriminated union (value / error / unset / donothing) and Value is only valid when the binding actually carries a value. Reading it on an error-only or unset binding is a contract violation.","triggerScenarios":"Accessing bindingValue.Value when Type is UnsetValue, DoNothing, BindingError (without fallback), or DataValidationError (without fallback) — i.e., HasValue is false.","commonSituations":"Code reads .Value unconditionally after receiving a BindingValue from a binding pipeline without checking HasValue. Refactoring that dropped a HasValue guard. Treating BindingValue like a nullable without using GetValueOrDefault.","solutions":["Check HasValue before accessing Value, or use GetValueOrDefault() which returns default(T) safely.","If you need the value-or-error, inspect Type first and branch (Value vs Error).","Use ToOptional() to convert to Optional<T> and handle absence explicitly."],"exampleFix":"// before\nvar v = bindingValue.Value; // throws if no value\n// after\nvar v = bindingValue.HasValue ? bindingValue.Value : defaultValue;\n// or\nvar v = bindingValue.GetValueOrDefault();","handlingStrategy":"validation","validationCode":"if (bindingValue.HasValue)\n    use(bindingValue.Value);\nelse\n    use(bindingValue.GetValueOrDefault());","typeGuard":"static bool HasValue<T>(BindingValue<T> bv) => bv.HasValue;","tryCatchPattern":"try { var v = bindingValue.Value; }\ncatch (InvalidOperationException) { v = default; }","preventionTips":["Always check HasValue before reading Value.","Prefer GetValueOrDefault() for safe access.","Branch on Type when handling the full binding-value union."],"tags":["binding","bindingvalue","value-access","data"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}