diff --git a/src/Avalonia.Base/BoxedValue.cs b/src/Avalonia.Base/BoxedValue.cs
new file mode 100644
index 0000000000..5fc515f299
--- /dev/null
+++ b/src/Avalonia.Base/BoxedValue.cs
@@ -0,0 +1,28 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+namespace Avalonia
+{
+ ///
+ /// Represents boxed value of type .
+ ///
+ /// Type of stored value.
+ internal readonly struct BoxedValue
+ {
+ public BoxedValue(T value)
+ {
+ Boxed = value;
+ Typed = value;
+ }
+
+ ///
+ /// Boxed value.
+ ///
+ public object Boxed { get; }
+
+ ///
+ /// Typed value.
+ ///
+ public T Typed { get; }
+ }
+}
diff --git a/src/Avalonia.Base/StyledPropertyBase.cs b/src/Avalonia.Base/StyledPropertyBase.cs
index eb112e753a..27a502246a 100644
--- a/src/Avalonia.Base/StyledPropertyBase.cs
+++ b/src/Avalonia.Base/StyledPropertyBase.cs
@@ -68,7 +68,7 @@ namespace Avalonia
{
Contract.Requires(type != null);
- return GetMetadata(type).DefaultValue;
+ return GetMetadata(type).DefaultValue.Typed;
}
///
@@ -164,7 +164,14 @@ namespace Avalonia
}
///
- object IStyledPropertyAccessor.GetDefaultValue(Type type) => GetDefaultValue(type);
+ object IStyledPropertyAccessor.GetDefaultValue(Type type) => GetDefaultBoxedValue(type);
+
+ private object GetDefaultBoxedValue(Type type)
+ {
+ Contract.Requires(type != null);
+
+ return GetMetadata(type).DefaultValue.Boxed;
+ }
[DebuggerHidden]
private Func Cast(Func validate)
diff --git a/src/Avalonia.Base/StyledPropertyMetadata`1.cs b/src/Avalonia.Base/StyledPropertyMetadata`1.cs
index ed01f1bc70..d1a0e2dc53 100644
--- a/src/Avalonia.Base/StyledPropertyMetadata`1.cs
+++ b/src/Avalonia.Base/StyledPropertyMetadata`1.cs
@@ -19,26 +19,26 @@ namespace Avalonia
/// A validation function.
/// The default binding mode.
public StyledPropertyMetadata(
- TValue defaultValue = default(TValue),
+ TValue defaultValue = default,
Func validate = null,
BindingMode defaultBindingMode = BindingMode.Default)
: base(defaultBindingMode)
{
- DefaultValue = defaultValue;
+ DefaultValue = new BoxedValue(defaultValue);
Validate = validate;
}
///
/// Gets the default value for the property.
///
- public TValue DefaultValue { get; private set; }
+ internal BoxedValue DefaultValue { get; private set; }
///
/// Gets the validation callback.
///
public Func Validate { get; private set; }
- object IStyledPropertyMetadata.DefaultValue => DefaultValue;
+ object IStyledPropertyMetadata.DefaultValue => DefaultValue.Boxed;
Func IStyledPropertyMetadata.Validate => Cast(Validate);
@@ -47,11 +47,9 @@ namespace Avalonia
{
base.Merge(baseMetadata, property);
- var src = baseMetadata as StyledPropertyMetadata;
-
- if (src != null)
+ if (baseMetadata is StyledPropertyMetadata src)
{
- if (DefaultValue == null)
+ if (DefaultValue.Boxed == null)
{
DefaultValue = src.DefaultValue;
}